我正在阅读关于“Tries”(字典树)和“Suffix Trees”(后缀树)的内容。
虽然我已经找到了一个“Trie”的代码,但是我找不到一个“Suffix Tree”的例子。而且我感觉建立“Trie”的代码和建立“Suffix Tree”的代码是一样的,唯一的区别在于前者存储前缀,后者存储后缀。
这是真的吗?有人能帮助我澄清这个问题吗?提供一个示例代码将是很好的帮助!
我正在阅读关于“Tries”(字典树)和“Suffix Trees”(后缀树)的内容。
虽然我已经找到了一个“Trie”的代码,但是我找不到一个“Suffix Tree”的例子。而且我感觉建立“Trie”的代码和建立“Suffix Tree”的代码是一样的,唯一的区别在于前者存储前缀,后者存储后缀。
这是真的吗?有人能帮助我澄清这个问题吗?提供一个示例代码将是很好的帮助!
后缀树可以看作是基于字典树的一种数据结构,不仅将字符串本身添加到字典树中,还会添加该字符串的每个可能的后缀。例如,如果您想在后缀树中索引字符串banana,则需要使用以下字符串构建字典树:
banana
anana
nana
ana
na
a
class SuffixTrie {
constructor(string) {
this.root = {};
this.endSymbol = '*';
this.populateSuffixTrieFrom(string);
}
// O(n^2) time | O(n^2) space
populateSuffixTrieFrom(string) {
for (let i = 0; i < string.length; i++)
this.insertSubStringStartingAt(i, string);
}
insertSubStringStartingAt(i, string) {
let node = this.root;
for (let j = i; j < string.length; j++) {
const letter = string[j];
if (!node.hasOwnProperty(letter)) node[letter] = {};
node = node[letter];
}
node[this.endSymbol] = true;
}
// O(m) time | O(1) space
contains(string) {
let node = this.root;
for (let letter of string) {
if (!node.hasOwnProperty(letter)) return false;
node = node[letter];
}
return node.hasOwnProperty(this.endSymbol);
}
}
我会给你一些片段来让你更清楚地理解。 免责声明:我不是专家,这些数据结构是从编程面试准备中学到的。
首先,如上所述:后缀字典树是由哈希表(最简单的变体)组成的结构,我们在其中存储所有可能的变体。因此,如果需要,我们可以搜索子字符串。 例如:'abc'。
{'a': True,
'a': {'b': True},
'a': {'b': {'c': True}},
'b': True,
'b': {'c': True},
'c': True}
Trie 是一种数据结构,用于存储完整的字符串以检查它们是否存在。
例如:{'t': {'h': {'i': {'s': {'*': 'this'}}}}, 'y': {'o': {'*': 'yo'}}
您可以在 Leetcode 上查看有关此问题的更多解释:实现 Trie (前缀树)。链接:https://leetcode.com/problems/implement-trie-prefix-tree/
Trie的节点具有指向较短上下文的链接,而“Tree”没有。如果树的节点得到指向较短上下文的链接,则会变成Trie;o)