后缀数组之高度数组

加了一点自己对高度数组的理解:

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)。

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值