后缀数组——罗穗骞倍增算法代码详解

本文详细介绍了使用罗穗骞倍增算法构建后缀数组的过程,包括数组sa、x和y的作用及排序原理。通过两次关键字排序,实现了第一关键字和第二关键字的合并,从而得到新的关键字顺序,用于后续的迭代。文章最后提供了算法的完整代码实现。
摘要由CSDN通过智能技术生成

首先解释一下用到的几个数组。

数组sa:构造完成前表示关键字数组,下标表示名次,值表示关键字的首字符位置,值相同的时候名次根据在原串中相对位置的先后决定;构造完成后表示后缀数组,下标表示名次,值表示后缀的首字符位置。

数组x:表示rank数组,下标表示关键字的位置,值表示关键字大小(rank),相同的值有相同的rank。初始化为字符串r的每个字符大小(此时x并不代表rank,只借助其值比较相对大小)。在每次迭代后,根据sa重新赋值,并代表rank。

数组y:排序后的第二关键字数组,下标表示名次,值代表第二关键字的首字符位置。


    for(i = 0; i < m; i++) 
        ws[i] = 0;
    for(i = 0; i < n; i++) 
        ws[x[i] = r[i]]++;
    for(i = 1; i < m; i++) 
        ws[i] += ws[i-1];
    for(i = n-1; i >= 0; i--) 
        sa[--ws[x[i]]] = i;

这段代码是计数排序,是对每个字符排序用来初始化数组sa和x。这段代码不难懂,原理我就不讲了,重点在于这个计数排序有个特点:

先根据x的值排序,x值相等时根据出现先后次序排序。

    for(j = 1,p = 1; p < n ; j <<= 1,m = p)
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值