转一个后缀数组的简单总结:
生活随笔
收集整理的這篇文章主要介紹了
转一个后缀数组的简单总结:
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
后綴數(shù)組就是將字符串所有后綴排序后的數(shù)組,設(shè)字符串為S,令后綴Suffix(i)表示S[i..len(S)]。用兩個(gè)數(shù)組記錄所有后綴的排序結(jié)果:
- Rank[i]記錄Suffix(i)排序后的序號(hào),即Suffix[i]在所有后綴中是第Rank[i]小的后綴
- SA[i]記錄第i位后綴的首字母位置,即Suffix[SA[i]]在所有后綴中是第i小的后綴
方法是倍增法,定義一個(gè)字符串的k-前綴為該字符串的前k個(gè)字符組成的串,關(guān)于在k-后綴上的定義Suffix(k,i)、SA[k,i]和Rank[k,i]類似于前,則有
- 若Rank[k,i]=Rank[k,j]且Rank[k,i+k]=Rank[k,j+k],則Suffix[2k,i]=Suffix[2k,j]
- 若Rank[k,i]=Rank[k,j]且Rank[k,i+k]<Rank[k,j+k],則Suffix[2k,i]<Suffix[2k,j]
- 若Rank[k,i]<Rank[k,j],則Suffix[2k,i]<Suffix[2k,j]
于是求出了所有后綴的排序,有什么用呢?主要是用于求它們之間的最長公共前綴(Longest Common Prefix,LCP)
令LCP(i,j)為第i小的后綴和第j小的后綴(也就是Suffix(SA[i])和Suffix(SA[j]))的最長公共前綴的長度,則有如下兩個(gè)性質(zhì):
令height[i]=LCP(i-1,i),即height[i]代表第i小的后綴與第i-1小的后綴的LCP,則求LCP(i,j)就等于求height[i+1]~height[j]之間的RMQ,套用RMQ算法就可以了,復(fù)雜度是預(yù)處理O(nlogn),查詢O(1)
然后height的求法要用到另一個(gè)數(shù)組:令h[i]=height[Rank[i]],即h[i]表示Suffix(i)的height值(同時(shí)height[i]就表示Suffix(SA[i])的height值),則有height[i]=h[SA[i]]
然后h[i]有個(gè)性質(zhì):
- h[i] >= h[i-1]-1
然后后綴數(shù)組的應(yīng)用就是利用它的LCP在需要字符串比較時(shí)降低復(fù)雜度。同時(shí)由于后綴數(shù)組的有序性可以很方便地使用二分
于是總結(jié)一下要點(diǎn):
- 利用倍增算法在O(nlogn)的時(shí)間內(nèi)對(duì)后綴數(shù)組進(jìn)行排序
- 利用h數(shù)組的性質(zhì)在O(n)的時(shí)間內(nèi)求出儲(chǔ)存排序后相鄰后綴間的LCP數(shù)的組height
- 利用LCP的性質(zhì)將平凡LCP問題轉(zhuǎn)化為height數(shù)組上的RMQ問題
本題是求兩字符串的最長公告子串(注意是子串不是子序列),構(gòu)造出SA,RA和HEIGHT后,答案就是最大的HEIGHT,但這個(gè)最大的HEIGHT可能是同一個(gè)串中的,
所以這個(gè)最大的HEIGHT同時(shí)要滿足sa[i-1]和sa[i]不在同一個(gè)串中。
轉(zhuǎn)載于:https://www.cnblogs.com/ACAC/archive/2010/05/24/1743092.html
總結(jié)
以上是生活随笔為你收集整理的转一个后缀数组的简单总结:的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [给 ASP.NET初学者的话]挑书与买
- 下一篇: 如何稀释 流事件 (如,onscroll