特里树是树状信息检索数据结构,其节点存储字母。它也被称为数字树或基数树或前缀树。尝试分为三类:
- 标准特里
- 压缩特里
- 后缀特里
标准Trie标准Trie具有以下属性:
- 标准Trie具有以下结构:
class Node { // Array to store the nodes of a tree Node[] children = new Node[26]; // To check for end of string boolean isWordEnd; }
- 它是像数据结构一样的有序树。
- 在一个标准的字典树中的每个节点(除了根节点)标记有字符。
- 节点的子级按字母顺序排列。
- 每个节点或分支代表键或单词的可能字符。
- 每个节点或分支可以具有多个分支。
- 每个关键字或单词的最后一个节点用于标记单词或节点的结尾。
下面是标准Trie的图示:
压缩的特里树压缩的特里树具有以下属性:
- 压缩的Trie具有以下结构:
class Node { // Array to store the nodes of tree Node[] children = new Node[26]; // To store the edgeLabel StringBuilder[] edgeLabel = new StringBuilder[26]; // To check for end of string boolean isEnd; }
- 压缩的Trie是标准Trie的高级版本。
- 每个节点(叶节点除外)至少有2个子节点。
- 它用于实现空间优化。
- 为了从标准Trie导出压缩Trie,执行冗余节点链的压缩。
- 它由字符键的分组,重新分组和取消分组组成。
- 在执行插入操作时,可能需要取消对已分组字符的分组。
- 在执行删除操作时,可能需要重新分组已分组的字符。
- 存储s个字符串(键)的压缩特里T具有s个外部节点,并且节点总数为O(s)。
下面是压缩的Trie的图示:
后缀Trie后缀Trie具有以下属性:
- 压缩的Trie具有以下结构:
struct SuffixTreeNode { // Array to store the nodes struct SuffixTreeNode *children[256]; //pointer to other node via suffix link struct SuffixTreeNode *suffixLink; // (start, end) interval specifies the edge, // by which the node is connected to its // parent node int start; int *end; // For leaf nodes, it stores the index of // Suffix for the path from root to leaf int suffixIndex; }
- 后缀Trie是压缩Trie的高级版本。
- 后缀特里最常见的应用是模式匹配。
- 在执行插入操作时,单词及其后缀都被存储。
- 后缀特里也用于单词匹配和前缀匹配。
- 为了生成后缀特里,给定字符串的所有后缀都被视为单个单词。
- 使用后缀构建压缩的特里。
下面是后缀Trie的图示: