後綴數組之高度數組

加了一點自己對高度數組的理解:

height 數組:定義 height[i]=suffix(sa[i-1])suffix(sa[i])的最長公共前綴,也就是排名相鄰的兩個後綴的最長公共前綴。那麼對於 j 和 k,不妨設rank[j]<rank[k],

則有以下性質:

suffix(j)suffix(k)的最長公共前綴height[rank[j]+1],height[rank[j]+2], height[rank[j]+3], ,height[rank[k]]中的最小值。

 

那麼應該如何高效的求出 height 值呢?

如果按 height[2]height[3],……,height[n]的順序計算,最壞情況下時 間 復 雜 度 爲 O(n2) 。 這 樣 做 並 沒 有 利 用 字 符 串 的 性 質 。 定 義h[i]=height[rank[i]]也就是suffix(i)和在它前一名的後綴的最長公共前綴。

 

h 數組有以下性質:

h[i]h[i-1]-1

 

 

證明:

suffix(k)是排在 suffix(i-1)前一名的後綴,則它們的最長公共前綴是h[i-1]

h[i-1]>1時,我們不妨設suffix(k) 爲”abcee…”suffix(i-1)爲 “abdee…”,前後對照可知它們的最長公共前綴長度爲2,那我們現在來考慮suffix(i)=”bdee”,那麼排在它前面的是哪一個呢,其實我們不得而知,但是我們知道一個下界,suffix(k+1)=”bcee” 已經給我們提供了一個下界。

假如suffix(k+1)剛好排在suffix(i)的前一個,那麼他們的最長公共前綴=1,此時h[i]=h[i-1]-1。如果suffix(k+1)不排在suffix(i)的前一個,而是前幾個,可知在suffix(k+1)suffix(i)之間插進了一個suffix(l),可想而知suffix(l)既要比suffix(k+1)大,又要比suffix(i)小,那麼它的第一個字符一定是’b’,第二個字符一定在’c’和’d’之間,後面的不用考慮可知suffix(l)suffix(i)的最長公共前綴>=suffix(k+1)suffix(i)的最長公共前綴,既h[i]h[i-1]-1恆成立。

h[i-1]<=1時,h[i-1]-1<=0,由h[]數組的定義可知,h[i]>=0所以h[i]h[i-1]-1恆成立。

 

按照 h[1],h[2],……,h[n]的順序計算,並利用 h 數組的性質,時間複雜度可以降爲 O(n)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章