Suffix array

A suffix array is a sorted array of all suffixes of a given string. The definition is similar to Suffix Tree which is compressed trie of all suffixes of the given text. Any suffix tree based algorithm can be replaced with an algorithm that uses a suffix array enhanced with additional information and solves the same problem in the same time complexity.

A suffix array can be constructed from Suffix tree by doing a DFS traversal of the suffix tree. In fact Suffix array and suffix tree both can be constructed from each other in linear time.
Advantages of suffix arrays over suffix trees include improved space requirements, simpler linear time construction algorithms (e.g., compared to Ukkonen’s algorithm) and improved cache locality.

最简单的构建方法就是把所有的后缀取出来再排序,时间复杂度是O(n^2lgn),因为每次比较都要O(n)。有了suffix array之后的查找开销需要O(mlgn),m为pattern长度,用二分查找。

当然,对于构建和查找都有线性的算法。

转自:http://www.geeksforgeeks.org/suffix-array-set-1-introduction/

时间: 2024-11-05 20:26:20

Suffix array的相关文章

后缀数组(suffix array)

参考: Suffix array - Wiki 后缀数组(suffix array)详解 6.3   Suffix Arrays - 算法红宝书 Suffix Array 后缀数组 基本概念 应用:字符串处理.生物信息序列处理 后缀:学过英语的都知道什么叫后缀,就是从某个位置开始到字符串结尾的特殊子串,记住 Suffix(i)=S[i...len(S)-1],i就是后缀起始位置 后缀数组:就是将后缀排序好后放到一个一维数组里,SA[i]存放排名第i大的后缀首字符下标,并且保证 Suffix(SA

后缀数组(Suffix Array)模板及简析——Part 1:构建SA和rank数组

后缀数组(Suffix Array,SA)是处理字符串的有力工具.它比后缀树更易实现,占用空间更少,并且同样可以解决千变万化的字符串问题 首先推荐罗穗骞的论文(网上搜一下就能搜到),里面对后缀数组的定义.实现和应用都做了详细的阐述 然而不幸的是罗神犇的代码简直魔性,蒟蒻表示这代码压的根本看不懂啊…… 所以在理解了后缀数组的构建过程之后,我重新写了一份模板代码.虽然啰嗦了点(代码比较大,而且变量名故意拉长了),不过相对比较好懂 而且论文中用到的辅助空间是4N,我的模板用了3N,事实上还可以优化到只

利用后缀数组(suffix array)求最长公共子串(longest common substring)

摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其重要的优势在于可以编码简单,代码易于理解,适合快速实现. 首先,来说明一下,LCS通常指的是公共最长子序列(Longest Common Subsequence,名称来源参见<算法导论>原书第3版p223),而不是公共最长子串(也称为最长公共子串). 最长公共子串问题是在文本串.模式串中寻找共有的

后缀数组(suffix array)详解

后缀数组(suffix array)详解 转载请注明:http://www.cnblogs.com/acmer-jsb/p/3988683.html 一.What  Is  Suffix Array? 用我的理解,后缀数组是一种功能强大的字符串处理工具,堪称字符串处理神奇,尤其是在字符串匹配方面更是有着出色的处理能力. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也不太逊色,并且,它比后缀树所占用的空间小很多.可以说,在信息学竞赛中后缀

后缀数组suffix array

倍增算法,时间复杂度O(nlogn) sa从小到大保存相对大小的下标 理解LSD,x数组,sa数组 char s[maxn]; int sa[maxn],t[maxn],t2[maxn],c[maxn],n; void build_sa(int m) { //LSD基数排序 int *x=t,*y=t2;//x数组保存rank //字串长度为1,即对每一个元素的大小排序 for(int i=0;i<m;++i) c[i]=0;//计数数组清空 for(int i=0;i<n;++i) c[x[

中山大学校队选拔赛第二试题试题3【Compressed suffix array】-------2015年2月8日

一:题目大意 本题通过给定三个数组S0,P,S,其中S0是1到2n的一个排列,P具有2n个整数,且满足: 数组S是把数组S0中所有奇数元素全部删除并将所有偶数元素除以2并按照原来的相对顺序进行排列而得. 现在给定数组S和数组P,我们需要反求数组S0. 二:题目分析 我们通过对数组P的递推式分析可知:当数组S0的元素是偶数时,这个元素所对应的Pi的值一定等于i.当数组S0的元素为奇数时,我们可以知道对应的Pi一定不等于i.那么我们可以先对数组P扫一遍,把存在Pi=i的元素全部填好,然后再对数组P重

Codeforces Round #256 (Div. 2) B. Suffix Structures

Bizon the Champion isn't just a bison. He also is a favorite of the "Bizons" team. At a competition the "Bizons" got the following problem: "You are given two distinct words (strings of English letters), s and t. You need to trans

Codeforces Round #256 (Div. 2) B. Suffix Structures(模拟)

题目链接:http://codeforces.com/contest/448/problem/B ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943/ma

【tyvj1860】后缀数组

描述 我们定义一个字符串的后缀suffix(i)表示从s[i]到s[length(s)]这段子串.后缀数组(Suffix array)SA[i]中存放着一个排列,满足suffix(sa[i])<suffix(sa[i+1]) 按照字典序方式比较定义height[i]表示suffix(sa[i])与suffix(sa[i-1])之间的最长公共前缀长度,其中height[1]=0你的任务就是求出SA和height这两个数组.字符串长度<=200000 输入格式 一行,为描述中的字符串(仅会出现小写