
Stringology
文章平均质量分 81
ljsspace
这个作者很懒,什么都没留下…
展开
-
计算后缀数组的LCP(Longest Common Prefix)
所谓LCP(Longest Common Prefix)是指后缀数组中相邻两个后缀的最长公共前缀的长度。在后缀数组的应用中,LCP是很重要的信息。设后缀数组为SA, 用LCP(i)定义为第SA[i]个后缀和第SA[i-1]个后缀之间的最长公共前缀长度。由于输入文本T的第p个后缀和原创 2011-07-20 00:21:08 · 11568 阅读 · 0 评论 -
构建后缀树的Ukkonen算法及其实现
Ukkonen算法(简称ukk算法)是一个online算法,它与mcc算法的一个显著区别是每次只对S的一个前缀生成隐式后缀树(implicit suffix tree),然后考虑S的下一个字符S[i+1]并将S[0...i+1]的所有后缀加入到上一个阶段中生成的隐式后缀树中,形成原创 2011-07-10 21:50:26 · 8544 阅读 · 1 评论 -
根据后缀树得出后缀数组
后缀数组(suffix array)是字符串S的所有后缀按照一定顺序(通常是字典顺序)排列后得出的数组,数组中每个元素的值等于该后缀的起始下标。要根据后缀树得出后缀数组,只需遍历所有的叶子结点(按照从左到右的顺序依次访问每个叶子结点),因为每一个叶子结点对应一个后缀,它的起始下标原创 2011-07-13 14:47:47 · 1386 阅读 · 1 评论 -
构造后缀数组的DC3算法实现
DC3算法(Difference Cover mod 3)是J. Kärkkäinen和P. Sanders在2003年发表的论文 "Simple Linear Work Suffix Array Construction"中描述的线性时间内构造后缀数组的算法。相对Prefix原创 2011-07-19 15:10:13 · 5181 阅读 · 0 评论 -
使用增强型后缀数组(ESA)的文本匹配算法
设模式串的长度为m,文本的长度为n,使用后缀数组做文本匹配,如果只用后缀表suftab和折半查找算法的复杂度为O(m*logn); 如果使用最长公共前缀表lcptab和折半查找算法,复杂度可以降至O(m+logn);使用增强型后缀数组(ESA)表childtab,复杂度为O(m)原创 2011-07-28 00:48:38 · 2179 阅读 · 2 评论 -
压缩存储后缀数组的childtab
相比后缀树,后缀数组的优势是存储空间小,相关算法效率高。但是若存放childtab还是使用up,down和nextLIndex三个属性,这显然不符合后缀数组节省空间的"第一原则"。幸运的是,可以压缩存储childtab,将三个属性up,down和nextLIndex变成一个一维数原创 2011-07-26 13:55:48 · 1215 阅读 · 0 评论 -
后缀树的自顶向下(top-down)遍历
与后缀数组的top-down遍历相比,后缀树的自顶向下遍历相对直接一些。下面的实现中首先确定每一个内部结点的左右后缀边界下标(prepare方法),然后先序遍历所有内部结点。实现:import java.util.ArrayList;import java.util.Linke原创 2011-07-25 19:36:39 · 1668 阅读 · 0 评论 -
后缀数组的自顶向下(top-down)遍历算法
类似于"后缀数组的自底向上(bottom-up)遍历算法",也可以对Enhanced Suffix Array执行自顶向下(top-down)遍历。这里通过增强信息--lcptable和childtab--来自顶向下遍历后缀数组。每一个后缀的childtab元素包含up,down原创 2011-07-25 19:30:27 · 1803 阅读 · 0 评论 -
后缀数组的自底向上(bottom-up)遍历算法
后缀数组自底向上遍历等价于后缀树的自底向上遍历。由于后缀数组不是树型结构,在遍历时除了SA本身之外还需要额外的信息,这时Suffix Array就是一个增强的后缀数组(Enhanced Suffix Array)了。该算法使用后缀数组的一个增强信息---LCP表,并通过堆栈模拟自原创 2011-07-23 23:53:10 · 2773 阅读 · 0 评论 -
后缀树的自底向上(bottom-up)遍历算法
与后缀数组的自底向上遍历算法的相比(参考博文“后缀数组的自底向上(bottom-up)遍历算法”),对后缀树的Bottom-Up遍历要直接一些。后缀树的Bottom-Up遍历过程是:如果孩子结点是内部结点,对这些孩子结点按照从左到右的词典序(lexicographic order原创 2011-07-24 11:55:26 · 4828 阅读 · 0 评论 -
根据后缀树LCA计算后缀数组及其LCP
本文继续“根据后缀树得出后缀数组“的讨论,进一步探讨从后缀树计算后缀数组的LCP。后缀数组的LCP(Longest Common Prefix)问题等价于后缀树的最小公共祖先LCA(Least Common Ancestor)问题。下面的方法将采用“根据后缀树得出后缀数组”一文中原创 2011-07-21 22:45:42 · 3041 阅读 · 0 评论 -
快速生成后缀树的McCreight算法及其实现
快速生成后缀树的McCreight算法及其实现作者: ljs2011-07-03(版权所有,转载请注明)McCreight算法(简称mcc算法)是基于蛮力法,即已知输入文本串T的内容(注:Ukkonen算法是online的,所以不要求事先知道T的全部内容),逐原创 2011-07-03 14:59:20 · 3837 阅读 · 0 评论 -
求字符串中不含重复字符的最长子串的长度
原帖:http://topic.youkuaiyun.com/u/20100930/02/5064ef5a-b2f4-44b9-8a16-ce2bf83323c0.html?84726题目:求字符串最长不含重复字符的子串长度,如abcbec,就返回3.分析:利用动态规划(DP)原理,设字符串原创 2011-07-09 00:15:04 · 3405 阅读 · 0 评论 -
后缀树(Suffix Tree)的文本匹配算法
后缀树(Suffix Tree)是一种特殊的Trie,它的用途非常广泛,其中一个主要的应用是作文本匹配,也像KMP等算法一样,它也是空间换时间的一个典范。利用 Suffix Tree做文本匹配与其他的模式匹配算法比如KMP和Boyer-Moore算法的主要区别是,后缀树文本匹配算法是对文本T做预处理,而KMP算法是对模式串P做预处理。因此后缀树常用于文本静态,而模式串动态的场合;而KMP等算法常用原创 2011-06-27 23:55:00 · 6856 阅读 · 3 评论 -
使用倍增算法(Prefix Doubling)构造后缀数组
如果采用对每个后缀排序的方法来生成后缀数组,即使采用快速排序,由于每次比较的对象是字符串(设输入字符串的长度为n),因此每一个比较操作的复杂度不再是常数,而是O(n),快速排序本身的平均情况下时间复杂度为O(nlgn),因此总的时间复杂度是O(n^2lgn),如果考虑到采用快速排原创 2011-07-18 00:17:34 · 5022 阅读 · 0 评论 -
Boyer–Moore–Horspool文本匹配算法(BM算法的简化版)
英语里有句习语叫"find a needle in a haystack",译成中文叫"大海捞针"(原意是在一堆干草中寻找一根针)。计算机中的文本匹配(string matching)就是要解决怎样在一段很长的文本中找到符合要求的一个子串,该子串通常叫模式串(pattern),也就是对应我们要找的“针”。常用的文本精确匹配(exact string matching)算法有蛮力法(brute-f原创 2011-06-19 13:02:00 · 11762 阅读 · 1 评论 -
KMP文本匹配算法
KMP算法作者:ljs2011-06-20(转载请注明出处,谢谢!)KMP(Knuth–Morris–Pratt)算法的发明时间几乎跟BM(Boyer-Moore)算法在同一时期,即上世纪70年代末(巧合的是随着互联网的发展对文本处理提出了更高的要求,从而最近几年字符处理又成了热门话题),二者在最坏情况下的时间复杂度都是O(n)。它与BM算法的主要区别是:1)在每次匹配中都是从左到右匹配,BM算法原创 2011-06-20 19:10:00 · 5860 阅读 · 0 评论 -
利用后缀树求多个字符串的最长公共连续子串(Longest Common Substring)
问题:有N个字符串,计算它们公共的最长连续子串。例如,字符串集合{abcd,bcca,aabc},它们公共的最长连续子串是bc。又如{abcfd,bcabca,aabcf}的公共的最长连续子串是abc。针对本问题,可以用特殊的字符(该字符必须是N个串中没有出现的字符)将N个字符串连起来形成一个新串,然后构建这个新串的后缀树。比如对字符串集合 {abcd,bcca,aabc},可以连成新串abcd$原创 2011-06-29 17:04:00 · 4750 阅读 · 0 评论 -
Boyer-Moore文本匹配算法(联合使用KMP和Horspool算法)
Boyer-Moore除了考虑Horspool算法(参考笔者的另一篇专门介绍Horspool算法的文章)的坏字符之外,还将模式串中已经匹配成功的后缀(叫做好后缀,good suffix)考虑进来,从而得到全部已经知道的启发信息(heuristic)。因此从理论上来说,BM算法应该是性能最佳的一个算法,实践中也证明了这一点。 这也是为什么BM算法经常用作精确匹配算法里面的性能测试基准算法。例如,在通原创 2011-06-21 22:44:00 · 4087 阅读 · 0 评论