参考:

Suffix array - Wiki

后缀数组(suffix array)详解

6.3   Suffix Arrays - 算法红宝书

Suffix Array 后缀数组

基本概念

应用:字符串处理、生物信息序列处理

后缀:学过英语的都知道什么叫后缀,就是从某个位置开始到字符串结尾的特殊子串,记住 Suffix(i)=S[i...len(S)-1],i就是后缀起始位置

后缀数组:就是将后缀排序好后放到一个一维数组里,SA[i]存放排名第i大的后缀首字符下标,并且保证 Suffix(SA[i])<Suffix(SA[i+1]), 1<=i<n 。

Rank数组:rank[i]存放suffix(i)的优先级

注:后缀数组和Rank数组为互逆运算。我们只要算出了sa数组,就可以在O(n)的时间复杂度内算出rank数组。

height数组:height[i]保存的是suffix(i)和suffix(i-1)的最长公共前缀的长度。也就是排名相邻的两个后缀的最长公共前缀


看图说话:

下面列出了aabaaaab的所有后缀,并对其标号1..8

构造Rank数组,对每个i一次计算其后缀的排名,如下第一个后缀排名第4,所以Rank数组第一个为4


怎么构造后缀数组

构造sa数组

构造rank数组

构造height数组


例子
aabaaaab

总共有n=8个后缀:

1: aabaaaab
2: abaaaab
3: baaaab
4: aaaab
5: aaab
6: aab
7: ab
8: b

按照字典序排序后

sa[ 1 ] = 4 aaaab
sa[ 2 ] = 5 aaab
sa[ 3 ] = 6 aab
sa[ 4 ] = 1 aabaaaab
sa[ 5 ] = 7 ab
sa[ 6 ] = 2 abaaaab
sa[ 7 ] = 8 b
sa[ 8 ] = 3 baaaab

rank数组为:

rank[1]=4
rank[2]=6
rank[3]=8
rank[4]=1
rank[5]=2
rank[6]=3
rank[7]=5
rank[8]=7

height数组为:

height[ 1 ]=null
height[ 2 ]= 3
height[ 3 ]= 2
height[ 4 ]= 3
height[ 5 ]= 1
height[ 6 ]= 2
height[ 7 ]= 0
height[ 8 ]= 1

因此,所有子串的最长公共子串就是3.

最新文章

  1. Http状态码之:301、302重定向
  2. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法
  3. 防御CSRF的方法有哪些(一) HTTP 头中自定义属性并验证 CSRF跨站域请求伪造攻击
  4. innodb 存储引擎特性
  5. position:absolute/relative/fixed小结
  6. 【c++】必须在类初始化列表中初始化的几种情况
  7. VC++ CButton::SetCheck 的使用方法
  8. LinkedList方法总结 ListIterator和Iterator的区别
  9. the differences between function and procedure
  10. Entity Framework系列
  11. 几个cd快速提示
  12. Chapter 2 Open Book——12
  13. leetcode 动态规划类型题
  14. C#实现简单的RPC
  15. Lzma(7-zip)和zlib
  16. HBase的Shell命令和JavaAPI
  17. python enumerate用法总结--转载
  18. sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序
  19. S4 继承
  20. as3中xml文件的加载和读取

热门文章

  1. linux安全运维之谁动了chattr
  2. 【原创】我所理解的自动更新-外网web服务器配置
  3. Canvas: Out of system resources
  4. 二十一、Java基础--------IO流之综合案例分析
  5. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
  6. C语言初学者代码中的常见错误与瑕疵(23)
  7. FilterControl 显示时间并精确到时分秒的方法
  8. 主机和虚拟机不能ping通问题
  9. JS—实现拖拽
  10. JS表单验证