后缀数组(基本概念及其构造方法之倍增算法)

本文介绍了后缀数组的基本概念,包括子串、后缀、字符串比较和后缀数组的定义。详细讲解了后缀数组的构造方法之一——倍增算法,阐述了算法的核心思想和步骤,并提供了罗穗骞大神的代码实现作为示例。此外,还提到了名次数组与后缀数组的关系。文章旨在帮助初学者理解和记忆后缀数组的相关知识。
摘要由CSDN通过智能技术生成

本人可以说是菜鸟一枚,最近在学习字符串算法,学到后缀数组。从其中涉及的基本定义,到构造后缀数组方法中的其中一种倍增算法,光这些知识,就弄得我云里雾里,前前后后看了有三四天。看了很多大神的博客,提取并进行了一些总结,为加深记忆,在这里写下来,以便以后理解。若有理解不对之处,欢迎各位大神指正。

1学习后缀数组,最先要明确的几个基本概念就是:子串后缀字符串的大小比较后缀数组名词数组这几个概念。(概念含义的描述基本都是大同小异了)

子串很好理解,就是在原字符串中任意截取的一段字符串。加符号描述为:字符串S的子串为r[ i…j ],(i和j分别表示子串在原字符串中开始和结束的位置,其中i ≤ j),

即r[ i…j ]表示的就是i到j这一段S[i],S[i+1],...,S[j]顺次排列形成的字符串


后缀一个字符串的后缀,就是指从该字符串中的某个位置i开始,到整个串末尾结束的这样的子字符串。比如字符串”aabaaaab”,这个字符串的后缀有:”aabaaaab”, “abaaaab”, “baaaab”, “aaaab”, “aaab”, “aab”, “ab”, “b”. 通常,我们描述字符串S从i位置开头的后缀表示为SuffixS,i,即Suffix(S,i)=r[i…len(S)]。


字符串的大小比较就是将两个字符串从头开始依次按字典序比较。如对于字符串u和v,令i从1开始顺次比较u[i]和v[i](实际编码时从0位置开始), 如果u[i]=v[i],则i+1,否则若u[i]<v[i]则认为u<v,u[i]>v[i]则认为u>v(也就是v<u),比较结束。如果i>len(u)或者i>len(v)仍比较不出结果,那么若len(u)<len(v)则认为u<v ,若len(u)=len(v) 则认为u=v ,若len(u)>len(v)则u>v。

为了方便处理长度不等的后缀之间的大小比较,我们通常约定给字符串的末尾添加一个特殊字符,这个特殊字符没有在字符串中出现过,而且比字符串中任何一个字符都要小。这样当两个不等长的后缀进行比较时,走到较短的后缀的最后一位时,大小自然可以比较出来。另外,对于约定的字符串S,从位置i开头的后缀直接写成Suffixi,省去Suffix(S,i)中的参数S。


后缀数组后缀数组SA就是一个一维数组,其元素是SA[0],SA[1]……SA[n-1],保证suffix(SA[i]) < Suffix(SA[i+1]) , 0 ≤ i<n-1。意思就是,首先我们将字符串S的所有n个后缀从小到大排序,我们将排序后的每个后缀的开始位置依次放在SA[0],SA[1]……SA[n-1]中。


名次数组名次数组Rank保存的是某一后缀在所有后缀中的排名(从小到大)。Rank[i]表示Suffix(i)在所有后缀中的排名。名次数组和后缀数组互为逆运算。有句话描述得很形象:后缀数组(SA)是 “ 排第几的是谁? ” ,名次数组(RANK)是 “你排第几? ” 

 

2基本概念了解完毕,下面开始了解构造后缀数组的方法

 

构造后缀数组可采用倍增算法(Doubling Algorithm)或DC3算法(Difference Cover mod 3).其中,倍增算法相对于DC3算法更好理解,而DC3算法的效率则更高。

我目前只看了倍增算法。

 

倍增算法,利用各个后缀之间的有机联系,把最坏的时间复杂度降低为O(nlogn)。其核心思想属于递推。

         整体思路可以说就是:由每个后缀的前K个字符的大小比较,从而得到前2k个字符的大小比较,依次类推……直至得到所有后缀的比较结果。我们把SAK称为k-后缀数组,其中元素SAK[0], SAK[1]……SAK[n-1]表示的是按照k-前缀(前k个字符)从小到大排序后的每个后缀的开始位置。Rankk含义参考SAK理解。若我们求出SAk和Rankk&#

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值