CHƯƠNG 2. ỨNG DỤNG CÂY HẬU TỐ ĐỂ SO KHỚP ĐỘ GIỐNG NHAU GIỮA CÁC TÀI LIỆU
2.2. Một số khái niệm cơ sở
Gọi Ʃ là một tập hữu hạn có thứ tự gọi là bảng chữ cái (alphabet), các phần tử € Ʃ đƣợc gọi là ký tự. Ʃ* là tập các xâu (string) gồm các ký tự € Ʃ. Có thể coi mỗi xâu € Ʃ* là một dãy hữu hạn tử € Ʃ. Ký hiệu ε là xâu rỗng, tập các xâu khác rỗng đƣợc gọi là Ʃ+ = Ʃ – {ε}.
Chiều dài của một xâu x, ký hiệu |x|, là số ký tự trong xâu x. Các ký tự trong xâu x đƣợc đánh số từ 0 tới |x| - 1: x = x0x1…x|x|-1.
Xâu nối của hai xâu x và y, ký hiệu xy, có chiều dài |x| + |y| và taọ thành bằng cách lấy các ký tự trong xâu x sau đó nối tiếp với các ký tự trong xâu y.
Gọi xâu w là tiền tố (prefix) của xâu x, ký hiệu w ͼ x, nếu tồn tại xâu y để x
= wy, xâu w đƣợc gọi là hậu tố (suffix) của xâu x, ký hiệu w ͽ x, nếu tồn tại xâu y để x = yw. Dễ thấy rằng nếu w là tiền tố hoặc hậu tố của x thì |w| ≤ |x|. Một xâu có thể vừa là tiền tố vừa là hậu tố của một xâu khác. Ví dụ ABA vừa là tiền tố vừa là hậu tố của xâu ABABA. Xâu rỗng vừa là tiền tố vừa là hậu tố của tất cả các xâu.
Hai quan hệ ͽ, ͼ có tính bắc cầu, tức là:
Nếu x ͼ y và y ͼ z thì x ͼ z.
Nếu x ͽ y và y ͽ z thì x ͽ z.
2.2.1. Trie hậu tố
Cho S là một tập gồm n xâu khác rỗng thỏa mãn: không xâu nào là tiền tố của một xâu khác. Trie của tập S là một cấu trúc dữ liệu dạng cây biểu diễn các xâu
Mỗi cạnh của cây có nhãn là một ký tự . Các cạnh đi từ một nút xuống các nút con của nó phải mang các nhãn hoàn toàn phân biệt.
Mỗi nút v trên trie cũng mang một nhãn, nhãn của nút v, ký hiệu ῡ là xâu tạo thành bằng cách nối tiếp các ký tự nhãn cạnh trên đường đi từ gốc xuống nút v.
Chiều dài của xâu ῡ: |ῡ| đƣợc gọi là độ sâu của nút v, ký hiệu depth(v). Theo cấu trúc của trie, hai nút khác nhau phải có xâu nhãn khác nhau.
Có tương ứng 1-1 giữa các xâu với các nút lá trên trie: trie có đúng n lá và mỗi lá có nhãn là một xâu
Hình 2.1 là trie biểu diễn 8 xâu: BEAR, BELL, BID, BULL, BUY, SELL, STOCK, STOP.
Hình 2.1. Trie
Các xâu trong tập S phải thỏa mãn tính chất phi tiền tố (prefix-free): không có xâu nào là tiền tố của một xâu khác, không thể xây dựng đƣợc trie biểu diễn tập S nếu điều kiện này bị vi phạm.
Tính chất phi tiền tố là một điều kiện quyết định để xây dựng trie, hầu hết những thuật toán dựa trên trie đều phải ràng buộc tính chất này của dữ liệu. Một trong những kỹ thuật để đảm bảo dữ liệu có tính phi tiền tố là bổ sung một ký tự đứng đầu bảng chữ cái Ʃ làm ký tự cầm canh mà ta ký hiệu là @: mỗi xâu sẽ đƣợc nối thêm ký tự @ vào cuối xâu để đảm bảo không có xâu nào là tiền tố của một xâu khác. Hình 3 là ví dụ về trie biểu diễn tập gồm 2 xâu: ABC@ và AB@. Có thể thấy rằng khi sử dụng ký tự cầm canh thì mọi cạnh trên trie nối tới nút lá đều mang nhãn @.
Hình 2.2. Vai trò của ký tự cầm canh @
Nếu S là tập các hậu tố khác rỗng của một xâu + thì trie biểu diễn S đƣợc gọi là trie hậu tố (suffix trie) của T. Để thỏa mãn tính chất phi tiền tố của tập S, ta coi xâu T có một ký tự cầm canh @ đúng cuối cùng còn mọi ký tự khác trong T đều không phải ký tự @.
Ví dụ nếu T là xâu BANANA@, tập S các hậu tố khác rỗng của T gồm có 7 xâu:
BANANA@
ANANA@
NANA@
ANA@
NA@
A@
@
Trie hậu tố của xâu BANANA@ có thể biểu diễn nhƣ trong hình 2.3.
Hình 2.3. Trie hậu tố 2.2.2. Cây hậu tố
Cây hậu tố T của chuỗi |S| kí tự của S là cây có hướng, có gốc và có các tính chất sau:
- Các đường đi từ gốc đến lá tương ứng 1 - 1 với các hậu tố của S.
- Mỗi nút trong, trừ nút gốc, có ít nhất là hai con.
- Mỗi cạnh đƣợc gán nhãn bằng một chuỗi con (không rỗng) của chuỗi S.
- Các cạnh bất kỳ xuất phát từ một nút chung phải bắt đầu bằng các ký tự khác nhau.
- Đối với mỗi nút lá thứ i, có nhãn là đường đi từ nút gốc đến nút đó biểu diễn hậu tố (suffix) thứ i của chuỗi S.
Để đảm bảo luôn dựng được cây hậu tố của chuỗi S người ta thêm một ký tự đặc biệt ($) vào cuối chuỗi S, gọi là kí tự kết thúc, nhƣ vậy sẽ không có hậu tố nào là tiền tố
của một hậu tố khác. Ví dụ cây hậu tố T(bbabab).
Hình 2.4. Cây hậu tố của chuỗi bbabab
Trong ví dụ minh họa cây hậu tố T của chuỗi = bbabab$ có bảy hậu tố là bbabab$, babab$, abab$, bab$, ab$, b$ và $ đƣợc đánh số từ 1 đến 7 nhƣ hình vẽ, nhãn của nút w là ab, nhãn của nút u là b và xâu baba là nhãn của đường đi từ gốc đến giữa cạnh (u, 2).
Sau đây là một số khái niệm liên quan đến cây hậu tố:
2.2.3. Chuỗi, chuỗi con, hậu tố và tiền tố
Một chuỗi S là danh sách các ký tự trên bảng chữ cái ∑ (có |∑| ký tự) đƣợc viết liên tục từ trái sang phải. Bất kỳ xâu con S[i..j] thu đƣợc cũng là một xâu ký tự liên tục trong S, có vị trí bắt đầu tại i và kết thúc tại j. Đặc biệt, S[1..i] là tiền tố của S kết thúc tại vị trí i và S[i..|S|] là hậu tố của S bắt đầu tại vị trí i.
2.2.4. Cây hậu tố tổng quát
Cây hậu tố tổng quát là một cây hậu tố đƣợc xây dựng cho tập các chuỗi Si. Mỗi nút lá lúc này nhận hai giá trị, một là chuỗi (i); hai là vị trí bắt đầu (hậu tố) của chuỗi đó.
Để giải quyết bài toán xâu con chung của hai hay nhiều chuỗi chúng ta cần mở rộng khái niệm cây hậu tố để chứa nhiều chuỗi khác nhau trong một cấu trúc dữ liệu chung, ta sử dụng cây hậu tố tổng quát, ví dụ cây hậu tố tổng quát T cho hai chuỗi S1=TACTAG và S2=CACT.
Hình 2.5. Cây hậu tố tổng quát cho chuỗi S1=TACTAG; S2 = CACT.
Độ sâu chuỗi của một nút v trong cây T là P(v), là tổng của tất cả độ dài cạnh trên đường đi từ gốc đến nút v, đường đi chính là chuỗi nhãn của nút v.
2.2.5. Liên kết hậu tố
Cho x biểu diễn một chuỗi bất kỳ, trong đó x biểu diễn ký tự đơn và biểu diễn một chuỗi con (có thể rỗng). Xét nút trong v với chuỗi nhãn x, nếu có một nút khác s(v) có nhãn là , một con trỏ từ v đến s(v) được gọi là liên kết hậu tố (suffix link). Trường hợp đặc biệt nếu rỗng thì x có liên kết hậu tố đƣợc trỏ đến gốc (root). Nút gốc không được coi là nút trong và không có liên kết hậu tố nào bắt đầu từ nó. Ví dụ như hình dưới đây, liên kết hậu tố được thể hiện là đường nét gạch nối.
Hình 2.6. Cây hậu tố tổng quát và các liên kết.