1. 程式人生 > >後綴數組學習筆記

後綴數組學習筆記

歸納 學習 rank 倍增 百度 根據 表示 技術 http

後綴數組

定義

後綴:Suffix(i)表示從i到結尾的字串

後綴數組:SA[i]表示將字符串的每個後綴按字典序排序後第i小的後綴的下綴

排名:Rank[i]表示第i位開始的後綴經過排序後是第幾小

做法

樸素做法O(n^2 log n)

倍增

先將第1位,第2位......第n位按大小排序(相同可以並列)

然後將第1位與第2位合並,第2位與第3位合並.....第n-1位與第n位合並

將合並完後的進行排序

之後再將第1~2位與第3~4位合並,第2~3位與第4~5位合並.......第n-3~n-2位與第n-1~n位合並

再排序

以此類推

貼個百度百科的圖。。。

技術分享圖片

直到沒有rank相同,結束

快排最壞O(n logn^2)

還是很慢。

我們註意到這裏相當與在做兩位數的排序,

所以我們就用

基數排序

每次排序O(n),總復雜度O(n log n)

簡單說下做法

先按個位數丟到標號為0-9的桶裏

串起來

再將十位數丟到標號為0-9的桶裏

再串起來

以此類推

這裏只要將“個位數”和“十位數”丟到編號為1-n的桶裏就夠了

代碼待補....


最長公共前綴(Longest Common Prefix)

定義

定義LCP(i,j)表示Suffix(i)與Suffix(j)的最長公共前綴

定理

LCP(i,j)=LCP(j,i)

LCP(i,i)=len(Suffix(SA[i]))=n-SA[i]+1

LCP Lemma:對於?j∈(i,k),1≤i<k≤n,都有LCP(i,k)=min(LCP(i,j),LCP(j,k))

證明:

設p=min(LCP(i,j),LCP(j,k)),u=Suffix(SA[i]),v=Suffix(SA[j]),w=Suffix(SA[k])

根據定義

u和v的前p個字符相等,v和w的前p個字符相等

所以u和w的前p個字符相等,LCP(i,k)≥p

不妨假設LCP(i,k)>p

技術分享圖片技術分享圖片

技術分享圖片

技術分享圖片

這與技術分享圖片技術分享圖片 不符

所以 LCP(i,k)=p

證畢

LCP Theorem:LCP(i,k)=min(LCP(j-1,j)) 1≤i<j≤k≤n

證明:

假設LCP(i,k-1)=min(LCP(j-1,j)) 1≤i<j≤k-1<n成立

因為LCP(i,k)=min(LCP(i,k-1),LCP(k-1,k))

所以LCP(i,k)=min(LCP(j-1,j)) 1≤i<j≤k≤n成立(數學歸納法)

證畢

未完,待填坑

後綴數組學習筆記