I. Giới thiệu chung
Có rất nhiều ứng dụng mà một xâu ký tự cố định được lặp đi lặp lại nhiều lần trong 1 văn bản có kích thước lớn. Việc tìm kiếm toàn bộ vị trí xâu ký tự này trong khoảng thời gian ngắn là một bài toán quan trọng.
Udi Manber và Gene Myers đã đề xuất một cấu trúc dữ liệu mới được gọi là mảng hậu tố (suffix array) để giải quyết bài toàn này vào năm 1989( sửa đổi năm 1991) được trình bầy trên bài báo Suffix arrays: A new method for on-line string searches.
II. Định nghĩa và cách xây dựng
1) Định nghĩa
A = a0a1 aN-1 là một văn bản có độ dài N,ký hiệu Ai = aiai+1 aN-1 ( 0 <=i<=N-1) được gọi là hậu tố của A tại vị trí thứ i. Một mảng số nguyên Pos chứa chỉ số i của các hậu tố Ai đã được sắp xếp theo thứ tự từ điển tức là Apos[0] < Apos[1] < . < Apos[N-1] được gọi là mảng hậu tố của A.
Ví dụ: Xâu A='assassin'
Từ xâu A ta có các hậu tốA0= assassin,A1=ssassin ,A2=sassin ,A3=assin ,A4=ssin, A5=sin,A6=in ,A7=n.
Sắp xếp các hậu tố đó theo thứ tự từ điển ta có mảng hậu tố POS .
8 trang |
Chia sẻ: aloso | Lượt xem: 2353 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Mảng hậu tố!, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
M¶ng hËu tè
Suffix Array
Giíi thiÖu chung
Cã rÊt nhiÒu øng dông mµ mét x©u ký tù cè ®Þnh ®îc lÆp ®i lÆp l¹i nhiÒu lÇn trong 1 v¨n b¶n cã kÝch thíc lín. ViÖc t×m kiÕm toµn bé vÞ trÝ x©u ký tù nµy trong kho¶ng thêi gian ng¾n lµ mét bµi to¸n quan träng.
Udi Manber vµ Gene Myers ®· ®Ò xuÊt mét cÊu tróc d÷ liÖu míi ®îc gäi lµ m¶ng hËu tè (suffix array) ®Ó gi¶i quyÕt bµi toµn nµy vµo n¨m 1989( söa ®æi n¨m 1991) ®îc tr×nh bÇy trªn bµi b¸o Suffix arrays: A new method for on-line string searches.
§Þnh nghÜa vµ c¸ch x©y dùng
§Þnh nghÜa
A = a0a1…aN-1 lµ mét v¨n b¶n cã ®é dµi N,ký hiÖu Ai = aiai+1…aN-1 ( 0 <=i<=N-1) ®îc gäi lµ hËu tè cña A t¹i vÞ trÝ thø i. Một mảng số nguyªn Pos chøa chØ sè i cña c¸c hËu tè Ai ®· ®îc s¾p xÕp theo thø tù tõ ®iÓn tøc lµ Apos[0] < Apos[1] < ... < Apos[N-1] ®îc gäi lµ m¶ng hËu tè cña A.
VÝ dô: X©u A='assassin'
Tõ x©u A ta cã c¸c hËu tèA0=’ assassin’,A1=’ssassin’ ,A2=’sassin’ ,A3=’assin’ ,A4=’ssin’, A5=’sin’,A6=’in’ ,A7=’n’.
S¾p xÕp c¸c hËu tè ®ã theo thø tù tõ ®iÓn ta cã m¶ng hËu tè POS .
X©y dùng m¶ng hËu tè
Sö dông thuËt to¸n Radix sort tiÕn hµnh s¾p xÕp c¸c hËu tè cña A theo thø tù tõ ®iÓn ®Ó thu ®îc m¶ng hËu tè POS.
2.1 ThuËt to¸n
C¸c hËu tè ®¬c xÕp vµo c¸c ng¨n (bucket ) nh thÕ mçi ng¨n cã thÓ cã nhiÒu hËu tè (h×nh 2.1), mçi lÇn s¾p xÕp ®îc tiÕn hµnh ë mét møc (gäi lµ cÊp) , ta s¾p xÕp ë cÊp 1,2,4,.. 2H. Khi s¾p xÕp ë mét cÊp H nµo ®ã, c¸c hËu tè ®îc s¾p xÕp theo H ký tù ®Çu tiªn vµ ®îc ®a vÒ ®óng vÞ trÝ trong bucket chøa nã.
Assin
Assassin
in
N
Sin
ssin
sassin
ssassin
H×nh 2.1: H×nh ¶nh cña m¶ng POS khi c¸c hËu tè ®îc ®a vµo c¸c Bucket
Bucket thø 1
Bucket thø 2
Bucket thø 3
Bucket thø 4
-NÕu Ai, Aj ë trong cïng H-bucket th× Ai vµ Aj cã H ký tõ ®Çu tiÒn gièng nhau.
Ta cã nhËn xÐt sau:
NÕu Ai trong H-bucket đầu tiªn ở cấp H(Tøc lµ Ai bắt đầu với x©u H ký tự nhỏ nhất) Th× Ai-H phải ở vị trÝ đầu tiªn của H-bucket chứa nã
X©y dựng mảng hậu tố
XÐt mảng :
Với mỗi Ai: chuyển Ai-H đến vị trÝ tiếp theo cã sẵn trong H-bucket
C¸c hËu tè b©y giê được sắp xếp theo thứ tự order
Ta lại xÐt mảng để quyết định hậu tố nào bắt đầu trong 2H-bucket (cấp 2H) mới, sử dụng lcp (tiền tố chung lớn nhất của 2 x©u) làm căn cứ. Ta không cần quan t©m đến nội dung của lcp giữa c¸c hậu tố trong cïng một H-bucket.
Đối với Ap, Aq trong cïng H-bucket nhưng lại kh¸c nhau trong 2H-bucket:
H < lcp(Ap, Aq) < 2H
lcp(Ap, Aq) = H + lcp(Ap+H, Aq+H)
Ví dụ:
Cấp H=1
Chuyển sang cấp H=2 ( 2 – Bucket)
Tiếp tục xÐt c¸c Ai
Tiếp tục xét A7, A2, A5, A1, A4 theo điều kiện Ai quyết định Ai –H ta có kết quả sau khi sắp xếp ở cấp 2H như sau:
2.2 §¸nh gi¸ ®é phøc t¹p cña thuËt to¸n
S¾p xÕp theo ký tù ®Çu tiªn – O(N)
O(logN) sè cÊp cña O(N) lÇn lÆp = O(NlogN)
Tæng thêi gian: O(NlogN)
Kh«ng gian nhí: 2 m¶ng sè nguyªn cã kÝch thíc lµ N
T×m kiÕm x©u con dùa vµo m¶ng hËu tè
Cho một chuỗi w, cho wp là tiền tố gồm có các ký hiệu p đầu tiên của w nếu w bao hàm nhiều hơn các ký hiệu p, và khác w.
Bài toán đặt ra là tìm kiếm xem xâu w có mặt trong xâu A hay không? Ở những vị trí nào?
Chúng ta định nghĩa quan hệ p , và ³ p theo một cách tương tự. Chú ý rằng, đối với lựa chọn bất kỳ nào của p, mảng Pos cũng theo bậc £ p bởi vì u £ dẫn đến u £ p . Tất cả các tiền tố mà bằng với các tiền tố p, đối với một vài p < N, hẳn phải xuất hiện ở vị trí kế tiếp trong mảng Pos, bởi vì mảng Pos được sắp xếp thuộc từ điển. Điều này quyết định tới thuật toán tìm kiếm của chúng ta.
Hai thuật toán sau đây cho phép chúng ta xác định xem xâu w có ở những hậu tố nào của xâu A. Ở đây w là tiền tố của các hậu tố Ai
4.1 Thuật toán tìm kiếm với O(Plog(N)
Ta ®Þnh nghÜa mét kho¶ng t×m kiÕm nh sau:
LW = min {k | W APos[k] hoÆc k = N}
RW = max {k | W APos[k] hoÆc k = -1}
W khíp víi ai ai+1 ...ai+P-1 ó i=Pos[k] trong ®ã k [LW, RW]
Ví dụ:
Việc tìm LW, RW là việc tìm khoảng so khớp:
If LW > RW => W không là xâu con của A.
Else sẽ có khoảng so khớp (RW-LW+1) với APos[LW],…, APos[RW]
Ta có thuật toán tính LW dựa vào ý tưởng của tìm kiếm nhị phân như sau:
àTheo thuËt to¸n trªn, víi Log(N) lÇn lÆp, mçi lÇn lÆp x¸c ®Þnh ®îc kho¶ng L,R míi (khëi t¹o L=0, R=N-1) b»ng c¸ch so s¸nh W víi APos[M] , ta x¸c ®Þnh ®îc M=(L+R)/2. Cuèi cïng lµ LW ç R
Như vậy, nếu Lw và Rw có thể tìm kiếm nhanh, thì các giá trị tương ứng là Rw – Lw + 1 và điểm bên trái cùng của chúng được cho bởi Pos [Lw], Pos [Lw+1] , … Pos [Rw] . Do đó việc tìm kiếm một số nhị phân đơn giản có thể tìm được Lw , Rw Ta có trong mỗi lần lặp ta có P phép so sánh, với P là độ dài của xâu w, có log lần lặp. Như vậy, mảng Pos cho phép chúng ta tìm tất cả các trường hợp của một chuỗi trong chuỗi A với độ phức tạp tính toán O(PlogN).
4.2 Thuật toán tìm kiếm với O(P + log(N))
Thuật toán tìm kiếm với O(Plog(N)) được trình bày ở trên tuy đơn giản, nhưng thời gian để chạy nó có thể được cải thiện. Chúng ta sẽ xem xét tiếp việc giải quyết các so sánh ≤ p trong việc tìm kiếm nhị phân mà không cần thiết phải được bắt đầu từ đầu trong mỗi phép lặp của toàn bộ vòng lặp. Chúng ta có thể sử dụng thông tin thu được từ một phép so sánh để tăng tốc độ cho các so sánh kế tiếp. Trong đó giải pháp này được thực hiện cùng với một vài thông tin trước đó được thêm vào, việc tìm kiếm được cải thiện đáng kể để thực hiện các phép so sánh ký tự đơn P + [ log2 (N - 1)] trong trường hợp xấu nhất.
§Ó t¨ng tèc ®é cña thuËt to¸n ta sö dông c¸c gi¸ trÞ lcp (lcp-long common prefixs – tiền tố chung dài nhất)
Thuật toán :
Các file đính kèm theo tài liệu này:
- Mảng hậu tố!.doc