Mô hình Otomat mờ so mẫu

Một phần của tài liệu Các cấu trúc dữ liệu và giải thuật hiệu quả cho bài toán tìm kiếm (Trang 95 - 100)

Do ý nghĩa của độ mờ là độ dài khúc đầu dài nhất của mẫu P đã xuất hiện trên S nên otomat sẽ có tập trạng thái là tập số nguyên {0, 1, …, m}. Hoạt động của otomat mờ so mẫu sẽ nhƣ sau:

- Khởi đầu con trỏ trên S là j = 0. Tại đó chƣa xuất hiện khúc đầu nào của mẫu nên trạng thái khởi đầu của otomat là q0 = 0.

88

- Duyệt S, mỗi lần một kí tự, bắt đầu từ S1. Giả sử trạng thái của otomat là q thì khi đọc đƣợc kí tự Sj, trạng thái mới (ứng với vị trí j trên S) sẽ là q‟ = δ(q, Sj) (δ là hàm chuyển của otomat).

- Tại vị trí j trên S, nếu trạng thái của otomat là q, có nghĩa khúc đầu dài nhất xuất hiện trên S của P có độ dài q. Nếu q = m, báo hiệu một lần xuất hiện mẫu, bắt đầu từ vị trí j – m + 1.

Mô hình otomat mờ cần đƣợc xây dựng một cách thích hợp để đáp ứng đƣợc yêu cầu sánh mẫu nhƣ trên.

Định nghĩa 4.3. Otomat mờ so mẫu là bộ ĂP) = (A, Q, q0, δ, F), trong đó: + Bảng chữ vào A = Ap {#},

+ Tập trạng thái Q = {0, 1, …, m} + Trạng thái khởi đầu q0 = 0, + Trạng thái kết thúc F = m, + Hàm chuyển δ: Q × A  Q

δ(q, a) = TFuzz(q, a)

Cách xác định hàm TFuzz:

Giả sử độ mờ xuất hiện mẫu P tại vị trí j trên S là λ. Khi đó độ mờ λ’ tại vị trí j+1 được xác định bởi λ’ = TFuzz(λ, Sj+1), với TFuzz được xác định như sau:

+ TFuzz(0,x) = {

89 + TFuzz(i,x) = {

Việc xác định j dựa vào bảng next (nhƣ trong thuật toán KMP) và một vòng lặp. 4.4.4 Thuật toán KMP mờ Khi cài đặt thuật toán cần lƣu ý lựa chọn cấu trúc dữ liệu phù hợp để có thể truy cập nhanh chóng trong bảng TFuzz. Gọi A[0.. k] là mảng lƣu trữ giữ bảng chữ A của otomat, trong đó k là số kí tự phân biệt trong mẫu P. Mảng đƣợc sắp theo chiều tăng của các kí tự và A[k] = ‟#‟. Để thuận tiện khi truy nhập đến các chữ cái trong A, có thể sử dụng mảng index xác định vị trí của các chữ trong bảng. Index[c] = { [ ]

[ ] [ ] [ ]

TFuzz là mảng [0..m, 0..k], trong đó TFuzz[i,j] là độ mờ mới khi độ mờ i gặp kí tự x có index[x] = j.

Chi tiết thuật toán tạo bảng TFuzz và tìm kiếm dựa vào bảng TFuzz nhƣ sau:

Thuật toán 4.5 Tạo lập TFuzz

Procedure initTFuzz(); Begin For i := 0 to m do TFuzz[i,k] := 0; For i := 0 to k do TFuzz[0,j] := 0; TFuzz[0, index[P[1]] := 1; For i := 1 to m do

90 For t := 0 to k – 1 do

Begin

If i = m then j := next[i + 1] Else j := i + 1;

While (j > 0) and (P[j] ≠ A[t]) do j := next[j]; TFuzz[i, index[A[t]] := j;

End; End;

Thuật toán 4.6 Tìm kiếm mẫu dựa vào bảng TFuzz

Procedure FKMP(); Begin

j := 1; counter := 0; fuz[0] := 0; For j := 1 to n do

Begin

Fuz[j] := TFuzz[fuz[j – 1 ], index[S[j]]; If fuz[j] = m then Begin counter := counter + 1; Ghi nhận vị trí j – m + 1; End; End; {for} Ghi nhận counter; End;

Độ phức tạp của thuật toán

91

Ví dụ 4.2. Với mẫu P = aababaab, A = {a, b, #}, Ap= {a, b}, bảng TFuzz đƣợc tính toán dựa trên mảng next cho kết quả nhƣ sau:

Q A A b # 0 1 0 0 1 2 0 0 2 0 3 0 3 4 0 0 4 2 5 0 5 6 0 0 6 7 0 0 7 2 8 0 8 4 0 0

Cho xâu đích S = aabaababaababaabab. Gọi j là con trỏ trên xâu S, là độ mờ xuất hiện mẫu P tại vị trí j trên S. Quá trình so mẫu P trên dòng dữ liệu S diễn ra nhƣ sau: J 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 S A A B A A B A B a A b a b A A b a b 1 2 3 4 2 3 4 5 6 7 8 4 5 6 7 8 4 5 Ghi nhận ghi nhận 11-8+1=4 16-8+1=9 Nhƣ vậy, mẫu P xuất hiện trong xâu S hai lần, bắt đầu tại các vị trí 4 và 9.

92

So sánh đánh giá các thuật toán đã tìm hiểu:

Vậy so với thuật toán KMP thì thuật toán KMP mờ tốt và hiệu quả hơn vì thuật toán KMP cải tiến từ thuật toán KMP kết hợp với otomat mờ nên sau khi tính bảng next, tính toán bảng TFuzz thì không còn hình ảnh dịch chuyển mẫụ

Xét sau khi tiền xử lý mẫu thì độ phức tạp của thuật toán KMP là O(m+n) và thuật toán KMP mờ là O(n).

Một phần của tài liệu Các cấu trúc dữ liệu và giải thuật hiệu quả cho bài toán tìm kiếm (Trang 95 - 100)