【後綴數組系列】二、後綴數組的兩種求法

如果直接求後綴數組的話,那就是給N個字符串進行從小到大的排序比較,需要的時間複雜度爲O(n2)。複雜度太高了。由第一篇文章可知,名次數組和後綴數組互爲逆運算,只要 求出名次數組,就可以在O(n)的時間內求出後綴數組。所以接下來介紹的兩種方法就是先求名次數組。

倍增算法

先對原串中每個字符進行排序,之後,從該字符開始,長度擴展一倍,迭代排序求出排名,即rank 值。k 從0 開始,每次加1,當2k大於n 以後,每個字符開始的長度爲2k的子字符串便相當於所有的後綴。並且這些子字符串都一定已經比較出大小,即rank 值中沒有相同的值,那麼此時的rank 值就是最後的結果。每一次排序都利用上次長度爲2k-1的字符串的rank 值,那麼長度爲2k的字符串就可以用兩個長度爲2k-1的字符串的排名作爲關鍵字表示,然後進行基數排序,便得出了長度爲2k的字符串的rank 值。

下面實戰來做一下。

仍舊以字符串“aabaaaab”爲例,整個過程如下圖所示。其中x、y 是表示長度爲2k的字符串的兩個關鍵字。


未完待續。。。


發佈了109 篇原創文章 · 獲贊 49 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章