後綴數組學習筆記
後綴數組
定義
後綴: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成立(數學歸納法)
證畢
未完,待填坑
後綴數組學習筆記