116
● Algorithm:
● Khởi tạo: Gán tập hợp S0 = W
● Bước 1: Xác định tập hợp S1 từ S0
● Khởi tạo S1 = { }
● Với ∀ wi, vj ∈S0 : nếu wi = vjA (vj là tiền tố của wi) hoặc vj = wiA (wi là tiền tố của vj) thì thêm A (phần hậu tố) vào S1
● Bước k: Xác định tập hợp Sk (k ≥ 2) từ tập hợp S0 và Sk-1
● Khởi tạo Sk = { }
● Với ∀ wi ∈S0 và wj ∈Sk-1 : nếu wi = vjA (vj là tiền tố của wi) hoặc vj = wiA (wi là tiền tố của vj) thì thêm A (phần hậu tố) vào Sk
● Điều kiện dừng vòng lặp:
● Nếu Sk = {} thì dừng và kết luận bảng mã tách được (k ≥1)
● Nếu tồn tại từ mã wi trong Sk hay Sk ∩ S0 # ∅ thì dừng và kết luận bảng mã không tách được.
● Nếu Sk = St<k thì dừng và kết luận bảng mã tách được (k ≥1)
117
● Bài toán 1
● Kiểm tra xem bảng mã W = {a, c, ad, abb, bad, deb, bbcde} có phải là bảng mã tách được hay không?
● Áp dụng giải thuật kiểm tra tính tách được của bảng mã:
● Khởi tạo: S0 = {a, c, ad, abb, bad, deb, bbcde}
● Bước 1: Tính S1
● Khởi tạo S1 = { }
● Vì a là tiền tố của ad nên đưa phần hậu tố “d” vào S1 ⇒ S1 = {d}
● Vì a là tiền tố của abb nên đưa phần hậu tố “bb” vào S1 ⇒ S1 = {d, bb}
● Kiểm tra điều kiện dừng: không thỏa → bước 2
● Bước 2: Tính S2 từ S0 và S1
● Khởi tạo S2 = { }
● Vì d ∈ S1 là tiền tố của deb và bb ∈ S1 là tiền tố của bbcde ⇒ S2 = {eb, cde}
● Kiểm tra điều kiện dừng: không thỏa → bước 3