后缀数组

术语解释:

后缀数组:常用SA[i]来表示,可以理解成rank[i].flag,意为字典序为i的后缀的起始位置。

名次数组:常用rank[i]来表示,可以理解成flag[i].rank,意为起始位置为i的后缀的字典序。


简单地说,后缀数组是“排第几的是谁?”,名次数组是“你排第几? ” 。可以看出,SA[i]和rank[i]是互逆的(看上面的[理解]就知道了)。举个例子,如下图:


增算法的主要思路是:用倍增的方法对每个字符开始的长度为 2^k 的子字符串进行排序,求出排名,即 rank 值。k 从 0 开始,每次加 1,当 2^k 大于 n 以后,每个字符开始的长度为 2^k 的子字符串便相当于所有的后缀。并且这些子字符串都一定已经比较出大小,即 rank 值中没有相同的值,那么此时的 rank 值就是最后的结果。每一次排序都利用上次长度为 2^(k-1) 的字符串的 rank 值,那么长度为 2^k 的字符串就可以用两个长度为 2 ^(k-1) 的字符串的排名作为关键字表示,然后进行基数排序,便得出了长度为 2^k 的字符串的 rank 值。以字符串 “aabaaaab ”为例,整个过程如图 2 所示。其中 x 、 y 是表示长度为 2^k 的字符串的两个关键字 。


Reference:部分文字及所有图片来自罗穗骞的论文,非常感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值