Mảng hậu tố (suffix array)
Mảng hậu tốSuffix ArrayI. Giới thiệu chungCó 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ựng1) Định nghĩaA = a0a1aN-1 là một văn bản có độ dài N,ký hiệu Ai = aiai+1aN-1 ( 0 <=i<=N-1) đợc gọi là hậu tố của A tại vị trí thứ i. Mt mng 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 . 11Xõy d ? ng m ?ng h ?u t ?Cho Ai trong H -bucket d ?u tiờn ? c?p HAib?t d ?u v ?i xõu H ký t ? nh ? nh ?tTh ỡ Ai-Hph ?i ? v?tr ớ d ?u tiờn c ?a H -bucket ch ? a núabef ab abcd ef cdab cdef bb bb .AiAi-HH=2:2) 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ánCá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 ssassinBucket thứ 1Bucket thứ 2Bucket thứ 3Bucket 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 cp H(Tức là Ai bt u vi xâu H ký t nh nht) Thì Ai-H phi v trí u tiên ca H-bucket cha nó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 14Xõy d ? ng m ?ng h ?u t ? Vớ d? v? thu ?t to ỏn:assin inassassin ssassinssinsinsassinnH=1A2A1A = assassin210 76543Aiquy ?t d ?nh Ai-1Xây dng mng hu tXét mng :Vi mi Ai: chuyn Ai-H n v trí tip theo có sn trong H-bucketCác hậu tố bây giờ c sp xp theo th t orderTa li xét mng quyt nh hu t n o b t u trong 2H-bucket (cp 2H) mi, s dng lcp (tin t chung ln nht ca 2 xâu) l m c n c. Ta khụng cn quan tâm n ni dung ca lcp gia các hu t trong cùng mt H-bucket.i vi Ap, Aq trong cùng H-bucket nhng li khác nhau trong 2H-bucket:H < lcp(Ap, Aq) < 2Hlcp(Ap, Aq) = H + lcp(Ap+H, Aq+H)Vớ d: Cp H=1H213Xõy d ?ng m ?ng h ?u t ? Vớ d? v? thu ?t to ỏn:assin inassassinssassinssinsinsassinnH=1A7A = assassin210 76543A6Aiquy ?t d ?nh Ai-1 Chuyển sang cấp H=2 ( 2 Bucket)–Tiếp tục xÐt c¸c AiTiế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:19Xây d ?ng m ?ng h ?u t ? –Ví d? v? thu ?t to án:assin inassassin ssinssassinsinsassinnH=1A = assassin210 76543A1A0Aiquy ?t d ?nh Ai-120Xây d ?ng m ?ng h ?u t ? –Ví d? v? thu ?t to án:assassin inassin ssinssassinsinsassinnH=1A = assassin210 76543A4A3Aiquy ?t d ?nh Ai-1 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à NIII. Tìm kiếm xâu con dựa vào mảng hậu tốCho mụt chuụi w, cho wp la tiờn tụ gụm co cac ky hiờu p õu tiờn cua w nờu w bao ham nhiờu hn cac ky hiờu p, va khac w.Bi toỏn t ra l tỡm kim xem xõu w cú mt trong xõu A hay khụng? nhng v trớ no?Chung ta inh nghia quan hờ < p la bõc t iờn cua p kớ hiu tin t, o la, u < p v nờu up < p. chung ta inh nghia quan hờ p, = p , p , >p , va p theo mụt cach tng t. Chu y rng, ụi vi la chon bõt ky nao cua p, mang Pos cung theo bõc p bi vi u dõn ờn u p . Tõt ca cac tiờn tụ ma bng vi cac tiờn tụ p, ụi vi mụt vai p < N, hn phai xuõt hiờn vi tri kờ tiờp trong mang Pos, bi vi mang Pos c sp xờp thuục t iờn. iờu nay quyờt inh ti thuõt toan tim kiờm cua chung ta. Hai thut toỏn sau õy cho phộp chỳng ta xỏc nh xem xõu w cú nhng hu t no ca xõu A. õy w l tin t ca cỏc hu t Ai4.1 Thut toỏn tỡm kim vi 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} pp 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 RNh vy, nu Lw v Rw cú th tỡm kim nhanh, thỡ cỏc giỏ tr tng ng l Rw Lw + 1 v im bờn trỏi cựng ca chỳng c cho bi Pos [Lw], Pos [Lw+1] , Pos [Rw] . Do ú vic tỡm kim mt s nh phõn n gin cú th tỡm c Lw , Rw Ta cú trong mi ln lp ta cú P phộp so sỏnh, vi P l di ca xõu w, cú log ln lp. Nh vy, mng Pos cho phộp chỳng ta tỡm tt c cỏc trng hp ca mt chui trong chui A vi phc tp tớnh toỏn O(PlogN).4.2 Thut toỏn tỡm kim vi O(P + log(N))Thut toỏn tỡm kim vi O(Plog(N)) c trỡnh by trờn tuy n gin, nhng thi gian chy nú cú th c ci thin. Chỳng ta s xem xột tip vic gii quyt cỏc so sỏnh p trong vic tỡm kim nh phõn m khụng cn thit phi c bt u t u trong mi phộp lp ca ton b vũng lp. Chỳng ta cú th s dng thụng tin thu c t mt phộp so sỏnh tng tc cho cỏc so sỏnh k tip. Trong ú gii phỏp ny c thc hin cựng vi mt vi thụng tin trc ú c thờm vo, vic tỡm kim c ci thin ỏng k thc hin cỏc phộp so sỏnh ký t n P + [ log2 (N - 1)] trong trng hp xu nht.Để 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)39Thu ?t to ỏn t ỡm ki ?mLM Rabcde . abd .abcdf .PosV?i Log(N) l ?n l ?p, m ?i l ?n l ?p x ỏc d ?nh du ? 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 d ?nh du ?c M=(L+R)/2.Cu ?i c ựng l LWRW= abcx Thuật toán : . 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ánCác hậu tố. 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