基本上一搜后缀数组网上的模板都是《后缀数组——处理字符串的有力工具》这一篇的注释,O(nlogn)的复杂度确实很强大,但对于初次接触(比如窝)的人来说理解起来也着实有些困难(比如窝就活活好了两天的光阴。。),看了那么多材料感觉《挑战程序设计》的后缀数组解释理解起来会相对容易很多,然而它的复杂度是O(nlog2n)的,主要区别是对子串排序的时候前者用了计数排序--O(n),而后者用了快排--O(nlogn),这就导致了最终的复杂度后者比前者多了一个O(logn)。

O(nlog2n)算法

先附清爽版求SA(Suffix_Array)模板,主要思想当然仍是倍增法;

 /*0(nlog(n)^2)*/
#include <iostream>
#include <cstring>
#include <cstddef>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN = ;
int n,k;
int rank[MAXN+],tmp[MAXN+]; bool comp_sa(int i, int j)
{
if(rank[i] != rank[j])
return rank[i] < rank[j];
int ri = i+k <= n? rank[i+k] : -;
int rj = j+k <= n? rank[j+k] : -;
return ri < rj;
} void calc_sa(string &S, int *sa) //计算字符串S的后缀数组
{
n = S.size();
//初始长度为1
for(int i = ; i <= n; i++)
{
sa[i] = i;
rank[i] = i < n ? S[i] : -;
} for( k = ; k <= n; k *= )
{
sort(sa,sa+n+,comp_sa); //双关键字快排 //先在tmp中临时存储新计算的rank,再转存回rank中
tmp[sa[]] = ;
for(int i = ; i <= n; i++)
{
tmp[sa[i]] = tmp[sa[i-]] + (comp_sa(sa[i-],sa[i]) ? : );
}
for(int i = ; i <= n; i++)
{
rank[i] = tmp[i];
}
}
} int main()
{
string S = "abracadabra";
int *sa = new int[S.size()+];
SuffixArrayMatch(S,sa,T);
delete [] sa;
sa = NULL;
}

当然初次接触的人看这代码必然不知这是什么鬼,建议可以多找几篇blog的代码注释(有很多大神的注释很细致很不错),加上手动模拟理解一下,多看几遍肯定会开窍的~;

定义(理解!):

后缀数组Suffix_Array:SA[]

  将某个字符串的所有后缀按字典序排序后得到的数组;

  SA[i] = k即表示排序后第i小的子串为S[k ... n](为好理解暂用字符串下标1~n);

  而最终我们要达到的SA数组状态如下例所示(摘自罗神的PPT):

aaarticlea/png;base64,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" alt="" width="612" height="460" />

名次数组:Rank[]

  保存后缀S[i ... n]在排序中的名次;

  rank[i] = k即表示子串S[i ... n]在所有后缀的字典序排序中为第k小;

通过图1可以看出SA[1] = 4, Rank[4] = 1; 即SA数组与Rank数组为互逆关系

后缀数组的计算

算法的基本思想 -- 倍增

什么叫倍增?

  首先计算每个位置开始的长度为1的子串的顺序,利用该结果计算长度为2的子串的顺序,再利用长度为2的子串的顺序结果计算长度为4的子串的顺序 ...... 不断倍增,知道长度大于等于原字符串长度,就得到了后缀数组;

  要计算长度为2的子串的顺序,只要排序两个字符组成的数对即可。

  比如原字符串 aaba (下面各字母的下标代表该字母在原字符串的位置)

  a1=a2=a4 < b3,那么a1a2一定小于a2b3

  要求长度为2k的子串的顺序,只要知道长度为k的子串的顺序即可。

  比如原字符串 aabac

  a1a2 < a2b3 < a4c5< b3a4,那么 a1a2b3a4 一定小于 a2b3a4c5

  记rankk(i)为S[i, k](从i开始的长度为k的子串)在所有排好序的长度为k的子串中是第几小的;

  要计算长度为2k的子串的顺序,就只要对两个rank组成的数对进行排序即可。通过rankk(i)与rankk(i+k)的数对和rankk(j)与rankk(j+k)的数对比较(双元素比较)来代替对S[i, 2k]和S[j, 2k]的直接比较。因为比较rankk(i)与rankk(j)就相当于比较S[i, k]与S[j, k],比较rankk(i+k)与rankk(j+k)就相当于比较S[i+k, k]与S[j+k, k]。

举个例子: abracadabra

初始化:SA[i] = i;

        rank[i] = S[i]; //初始的时为对字符串中的单个字符排序,故可以直接将rank初始为字符的ASCII码,注意此时的rank并非实际意义上的排序,仅仅是相对排序,即S[i]>S[j]则rank[i] > rank[j]而已;

    还有需要注意的一点是此处有一个处理字符串的小技巧是将SA[n] 定义为 -1;这样以后的rank值就可以从1开始排了。

k = 0,初始化,得到S[i, 1]的排序;

  sa[0] : 0         rank[0] : 97
  sa[1] : 1         rank[1] : 98
  sa[2] : 2         rank[2] : 114
  sa[3] : 3         rank[3] : 97
  sa[4] : 4         rank[4] : 99
  sa[5] : 5         rank[5] : 97
  sa[6] : 6         rank[6] : 100
  sa[7] : 7         rank[7] : 97
  sa[8] : 8         rank[8] : 98
  sa[9] : 9         rank[9] : 114
  sa[10] : 10      rank[10] : 97
  sa[11] : 11  rank[11] : -1

k = 1;得到S[i, 2]的排序;

  sa[0] : 11               rank[11] : 0
  sa[1] : 10       a      rank[10] : 1
  sa[2] : 0         ab     rank[0] : 2
  sa[3] : 7         ab     rank[7] : 2
  sa[4] : 3         ac     rank[3] : 3
  sa[5] : 5         ad     rank[5] : 4
  sa[6] : 1         br     rank[1] : 5
  sa[7] : 8         br     rank[8] : 5
  sa[8] : 4         ca     rank[4] : 6
  sa[9] : 6         da     rank[6] : 7
  sa[10] : 2        ra     rank[2] : 8
  sa[11] : 9        ra     rank[9] : 8

k = 2;得到S[i, 4]的排序;

  sa[0] : 11                rank[11] : 0
  sa[1] : 10        a        rank[10] : 1
  sa[2] : 0         abra      rank[0] : 2
  sa[3] : 7         abra      rank[7] : 2
  sa[4] : 3         acad      rank[3] : 3
  sa[5] : 5         adab      rank[5] : 4
  sa[6] : 8         bra        rank[8] : 5
  sa[7] : 1         brac      rank[1] : 6
  sa[8] : 4         cada      rank[4] : 7
  sa[9] : 6         dabr      rank[6] : 8
  sa[10] : 9        ra         rank[9] : 9
  sa[11] : 2        raca      rank[2] : 10

k = 4;得到S[i, 8]的排序;

  sa[0] : 11                  rank[11] : 0
  sa[1] : 10        a          rank[10] : 1
  sa[2] : 7         abra        rank[7] : 2
  sa[3] : 0         abracada     rank[0] : 3
  sa[4] : 3         acadabra     rank[3] : 4
  sa[5] : 5         adabra        rank[5] : 5
  sa[6] : 8         bra          rank[8] : 6
  sa[7] : 1         bracadab     rank[1] : 7
  sa[8] : 4         cadabra       rank[4] : 8
  sa[9] : 6         dabra          rank[6] : 9
  sa[10] : 9         ra              rank[9] : 10
  sa[11] : 2         racadabr      rank[2] : 11

k = 8;得到S[i, n]的排序;

sa[0] : 11                   rank[11] : 0
  sa[1] : 10    a            rank[10] : 1
  sa[2] : 7      abra       rank[7] : 2
  sa[3] : 0      abracadabra   rank[0] : 3
  sa[4] : 3      acadabra      rank[3] : 4
  sa[5] : 5      adabra       rank[5] : 5
  sa[6] : 8      bra         rank[8] : 6
  sa[7] : 1      bracadabra     rank[1] : 7
  sa[8] : 4      cadabra      rank[4] : 8
  sa[9] : 6      dabra       rank[6] : 9
  sa[10] : 9    ra           rank[9] : 10
  sa[11] : 2    racadabra       rank[2] : 11

这样就得到了SA数组;

对于字符串的排序采用双关键字快排,复杂度为O(nlogn);每次计算后缀S[i ... n] 的 rank值时,先与该后缀排序后的前一个后缀比较,如果相等则rank值相同,否则rank值加1;

 //先在tmp中临时存储新计算的rank,再转存回rank中
tmp[sa[]] = ;
for(int i = ; i <= n; i++)
tmp[sa[i]] = tmp[sa[i-]] + (comp_sa(sa[i-],sa[i]) ? : ); for(int i = ; i <= n; i++)
rank[i] = tmp[i];

O(nlogn)算法

声明:本部分大部分内容摘自staginner博文,写得很详细很明白~推荐!

还是先附清爽版代码

 #include <iostream>
#include <cstring>
#include <cstddef>
#include <cstdio>
#include <string>
#include <algorithm> int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int cmp(int *rank, int a,int b,int l)
{
return rank[a]==rank[b] && rank[a+l]==rank[b+l];
}
void DA(int *r,int *sa,int n,int m)
{
int i, k, p, *x=wa, *y=wb, *t; for(i=;i<m;i++) ws[i] = ;
for(i=;i<n;i++) ws[x[i] = r[i]]++;
for(i=;i<m;i++) ws[i] += ws[i-];
for(i=n-;i>=;i--) sa[--ws[x[i]]] = i; for(k=, p=; p<n; k*=, m=p)
{
p=; for(i=n-k;i<n;i++) y[p++]=i;
for(i=;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k; for(i=;i<n;i++) wv[i]=x[y[i]]; for(i=;i<m;i++) ws[i]=;
for(i=;i<n;i++) ws[wv[i]]++;
for(i=;i<m;i++) ws[i]+=ws[i-];
for(i=n-;i>=;i--) sa[--ws[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],k)?p-:p++;
}
return;
} DA(r,sa,n+,);

总觉得把整个代码和注释混一起看好烦躁,分解开来一部分一部分看吧~

定义:

int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
/*
wa[]: 本意是保存各个后缀的rank值的,但是这里并没有去存储rank值,因为后续只是涉及wa[]的比较工作,
因而这一步可以不用存储真实的rank值,能够反映相对的大小即可。
wb[]: 存放的是按第二关键字排序的子串首字符下标
wv[]: 存放每个子串的第一关键字
ws[]: 存放每个rank值的数目
*/

函数:

void da(int *r,int *sa,int n,int m)
{
...
}
/*
*r: 字符串(数组)
*sa: 后缀数组
n: 字符串中字符的个数,注意这里的n里面是包括人为在字符串末尾添加的那个0的
m: 字符串中字符的取值范围,是基数排序的一个参数,如果原序列都是字母可以直接取128,如果原序列本身都是整数的话,则m可以取比最大的整数大1的值。
*/
int i, k, p, *x=wa, *y=wb, *t;
/*
*x 代替wa数组,*y 代替wb数组
*t 作交换指针
*/

以下四行代码是把长度为1的子串进行基数排序 Tips: 如果不理解为什么这样可以达到计数排序的效果,建议自己实际用纸笔模拟一下!

for(i=;i<m;i++) ws[i] = ;
for(i=;i<n;i++) ws[x[i] = r[i]]++;
for(i=;i<m;i++) ws[i] += ws[i-];
for(i=n-;i>=;i--) sa[--ws[x[i]]] = i;
/*
ws[]: 存放每个rank值的数目;
第1行,清零;
第2行,上面已经提到x[]保存的是后缀的相对rank值,x[i]=r[i]的意思是将x[i]初始化为各字符的ASCII值,字符的ASCII值也就可以代表长度为1的子串的相对顺序;
第3行,求出最后一个子串i的rank是多少,供第4行使用
第4行,相当于从后向前得到各子串的sa[]数组,i之所以从n-1开始循环,是为了保证在当字符串中有相等的字符串时,默认靠前的字符串更小一些。
*/

注意理解上述“相对顺序”的含义,上一部分也提到过这个概念,我们并不需要求出子串的排序到底是1还是2,我们只需要达到若r[i]<r[j],则x[i]<x[j]的要求即可。这也解释了利用字符的ASCII值初始x[]数组的合理性;

主要循环:

for(k=, p=; p<n; k*=, m=p)
{
...
}
/*
这层循环中p的值表示的是此时关键字不同的子串的数量,也可以这么理解,所有子串排序后,相等的子串rank值相同,则关键字的范围是[1,p];
如果p达到n,即各后缀的rank与sa 已全部求出,因为后缀长度不一,所以不可能出现相等的情况;
k代表当前待合并的字符串的长度,每次将两个长度为k的字符串合并成一个长度为2k的字符串——倍增思想;
m同样代表基数排序的元素的取值范围
*/

以下两行代码实现对第二关键字的排序

此处我们需要借助罗神的插图来理解了

我们可以这么理解所谓第二关键字 (为避免混淆,原字符串r换为字母s来表示)

首字符为i长度为1的子串没有第二关键字

首字符为i长度为2的子串s[i,2]的第一关键字为s[i,1]的rank值,第二关键字为s[i+1,1]的rank值;

首字符为i长度为4的子串s[i,4]的第一关键字为s[i,2]的rank值,第二关键字为s[i+2,2]的rank值;

...

首字符为i长度为2k的子串s[i,2k]的第一关键字为s[i,k]的rank值,第二关键字为s[i+k,k]的rank值;

由图2,可以看到首字符下标为n-k至n的子串的第二关键字都为0,因此如果按第二关键字排序,必然这些子串都是排在前面的。(第二关键字为0即无法构成以r[i]为首字符的长度为2k的子串,长度都不够,自然字典序会小咯)—— 第1个循环。

我们还可以看到,下面一行的第二关键字的值(非0)都是上一轮的rank值,且上一行中只有首字符下标(sa[i])>=k的子串的rank值才会作为下一行的首字符下标为sa[i]-j的子串的第二关键字,而且显然按sa[i]的顺序rank[sa[i]]是递增的(rank[sa[i]] == i) —— 第2个循环。

图2的y[]值为

k: 1时
y[0] : 8
y[1] : 7
y[2] : 0
y[3] : 2
y[4] : 3
y[5] : 4
y[6] : 5
y[7] : 1
y[8] : 6

k: 2时
y[0] : 7
y[1] : 8
y[2] : 6
y[3] : 1
y[4] : 2
y[5] : 3
y[6] : 4
y[7] : 5
y[8] : 0

y[i] = x的含义是按第二关键字排序后第i小的子串首字符下标为x;

记住y[]里存放的是按第二关键字排序的子串首字符下标!

 p=; for(i=n-k;i<n;i++) y[p++]=i;
for(i=;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
for(i=;i<n;i++) wv[i]=x[y[i]];
/*这里相当于提取出每个子串的第一关键字(前面说过了x[]是保存上一轮的rank值的,也就是子串的第一关键字),放到wv[]里面是方便后面的使用*/

以下四行代码是按第一关键字进行的基数排序

wv[]: 存放每个长度为k的子串的第一关键字,wv[i] = x的含义为按第二关键字第i小的子串的第一关键字的值;
ws[]: 存放每个关键字的个数

for(i=;i<m;i++) ws[i]=;
for(i=;i<n;i++) ws[wv[i]]++;
for(i=;i<m;i++) ws[i]+=ws[i-];
for(i=n-;i>=;i--) sa[--ws[wv[i]]]=y[i];
/*i之所以从n-1开始循环,含义同上,同时注意这里是y[i],因为y[i]里面才存着字符串的下标*/

最后一行巧妙地将第一关键字与第二关键字结合起来了,注意理解!

下面两行就是计算合并之后的rank值了,而合并之后的rank值应该存在x[]里面,但我们计算的时候又必须用到上一层的rank值,也就是现在x[]里面放的东西,如果我既要从x[]里面拿,又要向x[]里面放,怎么办?
当然是先把x[]的东西放到另外一个数组里面,省得乱了。这里就是用交换指针的方式,高效实现了将x[]的东西“复制”到了y[]中。

t=x,x=y,y=t;
for(p=,x[sa[]]=,i=;i<n;i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],k)?p-:p++; /*
这里就是用x[]存储计算出的各字符串rank的值了,记得我们前面说过,计算sa[]值的时候如果字符串相同是默认前面的更小的,但这里计算rank的时候必须将相同的字符串看作有相同的rank,要不然p==n之后就不会再循环啦
p的值表示的是此时关键字不同的串的数量
cmp比较函数,合并的子串相同则返回1,不同返回0;
注意p和i的初始值需为1,因为循环中存在i-1和p-1,而x[sa[0]]的值也需初始化为0
*/
选计数排序一个重要的原因,它是一个稳定排序,这就保证了数组的下标是第二关键字,我们前面说了,对于倍增长度k,利用之前排序k/2长度后得到的rank数组作为关键字,把后k/2部分作为第二关键字,嗯,就是这里,所以我们要先排后k/2的序,然后得到新的数组序列,下标就是第二关键字了,数组里面就是前k/2 rank的值,这是第一关键字,那么直接排序就相当于先对前k/2排序,如果这里相等,那么就会按下标排序,即第二关键字排序。

最新文章

  1. java访问修饰符
  2. ABP理论学习之SignalR集成
  3. maven基本用法
  4. 如何利用word2013写图文并茂的博客
  5. 在做excel导出时如何将excel直接写在输出流中
  6. Inside Flask - Flask 简介
  7. js/jquery 操作document对象
  8. css 字间距离_css 字体字符间距设置
  9. bzoj1297: [SCOI2009]迷路
  10. PHP安全编程:更优的会话数据安全 更好地防范session暴露(转)
  11. POJ1017 packets
  12. hdu 4750 Count The Pairs(并查集+二分)
  13. 从《海贼王》的视角走进BAT的世界(百度/阿里/腾讯)
  14. NEO-Karl-Python1
  15. Windows程序设计_21_Win32文件操作
  16. 装饰者模式vs适配器模式
  17. (转载)Windows下小狼毫输入法(Rime)的安装与配置(含导入搜狗词库)
  18. python 面向对象 公有属性 用在哪里
  19. TextBox 控件
  20. 03--CSS布局设置

热门文章

  1. 从‘void*’到‘int’的转换损失精度
  2. JVM物理结构和在内存中的组织结构
  3. MVC-Model
  4. spring+redis+nginx 实现分布式session共享
  5. PHP 7的一些引人注目的新特性简单介绍
  6. php 获取当前域名
  7. 【转】Monkey测试5-运行中停止monkey
  8. AJAX是基于现有的Internet标准
  9. Java凝视分类
  10. CMake error:System Error:No such file or directory CMake error:Could not open file for write in copy operation xxxx.ros_Config.cmake.tmp.