Suffix Trie
:
又称后缀Trie或后缀树。它与Trie树的最大不同在于,后缀Trie的字符串集合是由指定字符串的后缀子串构成的。比如、完整字符串"minimize"的后缀子串组成的集合S分别如下:
s1=minimize
s2=inimize
s3=nimize
s4=imize
s5=mize
s6=ize
s7=ze
s8=e
然后把这些子串的公共前缀作为内部结点构成一棵"minimize"的后缀树,如图所示,其中上图是Trie树的字符表示,下图是压缩表示(详细见《Trie树
》)。可见Suffic Trie是一种很适合操作字符串子串的数据结构。
它和PAT tree在这一点上类似。
Suffix Trie的创建
标准Tire树的每一个内部结点只有一个字符,也就是说公共前缀每一次只找一个。而Suffix Trie的公共前缀可以是多个字符,因此在创建Suffix Trie的时候,每插入一个后缀子串,就可能对内部结点造成一次分类。下面我们我们看一种后缀树构造算法。以"minimize"为例:
当插入子串时,发现叶子结点中的关键字与子串有公共前缀,则需要将该叶子结点分裂。如上图第3到4步。否则,重新创建一个叶子结点来存放后缀,如上图第1到2步
Suffix Trie的子串查询
如果在后缀树T中查找子串P,我们需要这样的过程:
(1) 从根结点root出发,遍历所有的根的孩子结点:N1,N2,N3....
(2) 如果所有孩子结点中的关键字的第一个字符都和P的第一个字符不匹配,则没有这个子串,查找结束。
(3) 假如N3结点的关键字K3第一个字符与P的相同,则匹配K3和P。
若 K3.length>=P.length 并且K3.subString(0,P.length-1)=P,则匹配成功,否则匹配失败。
若 K3.length<=P.length 并且K3=P.subString(0, K3.length-1),则将子串P1=P.subString(K3.length, P.length); 即取出P中排除K3之后的子串。然后P1以N3为根结点继续重复(1)~(3)的步骤。直到匹配完P1的所有字符,则匹配成功。否则匹配失败。
查询效率:很显然,在上面的算法中。匹配成功正好比较了P.length次字符。而定位结点的孩子指针,和Trie情况类似,假如字母表数量为d。则查询效率为O(d*m),实际上,d是固定常数,如果使用Hash表直接定位,则d=1.
因此,后缀树查询子串P的时间复杂度为O(m),其中m为P的长度。
Suffix Trie的应用
标准Trie树只适合前缀匹配和全字匹配,并不适合后缀和子串匹配。而后缀树在这方面则非常合适。
另外后缀树也可以进行前缀匹配。
如果模式串P是字符串S的前缀的话,那么从根结点出发遍历后缀树,一定能够寻找到一条路径完全匹配完P。比如上图: 模式串P=“mini”,主串S="minimize"。P从根节点出发,首先匹配到结点mi,然后再匹配孩子结点nimize。直到P中所有的字符都找到为止。所以P是S的前缀。
分享到:
相关推荐
后缀树,也被称为字典树或Trie,是一种数据结构,主要应用于字符串搜索和处理。在计算机科学中,特别是文本处理和信息检索领域,后缀树是一种非常重要的工具,它能够高效地解决多字符串匹配问题。这个压缩包中的内容...
后缀树是一种在计算机科学中广泛使用的数据结构,它能够快速解决字符串处理中的诸多问题,例如快速查找字符串中的模式、子串、重叠等。本文将深入探讨后缀树的定义、用途、构建方法以及一个挑战性问题。 首先,后缀...
后缀树(Suffix Tree)是一种高效的数据结构,主要用于字符串算法,尤其在文本搜索、模式匹配等领域有着广泛的应用。它的核心思想是将一个字符串的所有后缀作为关键字存储在一个压缩的树形结构中,使得查找字符串中...
SuffixArray是一种高效的数据结构,主要用于字符串的搜索和处理。它以一种有序的方式存储了一个字符串的所有后缀,使得在大量文本中进行模式匹配、查找、排序等操作变得非常快速。在这个扩展版本中,我们以单词为...
在IT领域,后缀树(Suffix Tree)是一种高效的数据结构,尤其在文本处理、字符串搜索和模式匹配等任务中有着广泛的应用。这个压缩包“SuffixTree_java.zip_javascript”虽然带有JavaScript标签,但从文件列表来看,...
1. **KMP算法**:KMP(Knuth-Morris-Pratt)算法是一种用于字符串匹配的高效算法,避免了不必要的字符比较。它通过构造不回溯的“部分匹配表”来提高查找速度,减少在主串中重复扫描已匹配过的字符。 2. **Rabin-...
主算法2引入了后缀树(Suffix Tree)的概念,这是一种更为强大的数据结构,能够在线性时间内解决多串匹配问题。后缀树通过对所有模式串的后缀进行压缩,形成一棵树,每个路径代表一个模式串的后缀。通过后缀树,可以...
后缀树是一种强大的数据结构,尤其在处理字符串问题时,如模式匹配、字符串搜索和文本分析等场景。它实质上是压缩后的 Trie 数据结构,能够高效地存储和操作字符串的后缀。 首先,后缀树的基本概念是它包含了输入...
6. **Trie(字典树)数据结构**:Trie是一种高效的数据结构,用于存储字符串集合,便于进行前缀查找、插入和删除操作。在字符串相关的问题中,如单词搜索或拼写检查,Trie常被使用。 7. **Suffix Array(后缀数组)...
它能快速查找字符串的所有子串,常用于生物信息学中的DNA序列分析和文本索引。 六、Patricia Trie(PAT树) PAT树是优化后的Trie结构,减少了节点数量,节省空间,适用于内存有限的情况。它同样适用于快速查找和...
9. **字符串在数据结构中的应用**:如Trie树(字典树)和suffix tree(后缀树)等,用于快速查找和操作字符串集合。 10. **正则表达式**:正则表达式是一种强大的文本处理工具,用于模式匹配和提取。学习正则表达式...
4. **Z-Algorithm**:一种在线的字符串匹配算法,可以同时找到所有子串的所有非重叠匹配。Z-数组是核心,记录了每个位置最长前后缀的长度,使得查找过程变得高效。 5. **动态规划法**:在字符串问题中,动态规划常...
- **字符串匹配**:可以通过查询不同版本的后缀数组来判断两个字符串是否包含相同的子串。 - **子串统计**:统计某个子串出现的次数或位置,这对于文本检索系统非常有用。 ##### 4.2 高级应用 - **模式匹配**:对于...
与常见的后缀数组、后缀树等数据结构相比,后缀自动机具有在线构建的特点,即可以随着输入字符串的增长而动态构建,非常适合处理动态变化的数据。 #### 二、自动机基础概念 ##### 2.1 有限状态自动机 有限状态...
后缀数组的主要用途是进行模式匹配和字符串查询,例如在文本中查找所有出现的子串,找出最长重复子串,或者计算LCP(Longest Common Prefix)数组等。在信息检索、生物信息学等领域有广泛应用。 模板文件通常包含了...
4. **文本搜索索引**:例如,后缀树(Suffix Tree)或后缀数组(Suffix Array),用于快速查找文本中的模式或子串。后缀树尤其适用于大型文本文件,通过将文件视为位向量,构建的 Trie 只包含具有分支的节点,从而...
因此,这个项目可能是利用特定的算法和数据结构,如Trie树、TF-IDF、TextRank或LSI(Latent Semantic Indexing),来实现中文文本的关键词提取功能,并且已经过测试,能在VC2008下正常运行。 “Suffix_Array”这个...
- **Z算法**:计算字符串的LPS(Longest Proper Prefix which is also a Suffix),用于快速查找子串。 6. **网络流**: - **Ford-Fulkerson算法**:用于寻找网络的最大流,解决流量分配问题。 - **Edmonds-Karp...
字符串匹配(KMP) Knuth-Morris-Pratt 最小生成树(Kruskal) Kruskal 最近公共祖先(Tarjan) Least-Common-Ancestor(Tarjan) 使用后缀数组求解最长公共子串 Longest-Common-Substring 最长上升子序列(n·log...