Trie 数据结构:如何在搜索单词时防止误报?
Trie Data Structure : How tp prevent false positives when searching a word?
class Node{
Map<Character,Node> childMap = new HashMap<>();
boolean isWord;
}
一个trie数据节点通常表示为如上class。
假设我们插入了
- "bad"
- "parent"
进入特里。
如果在trie中搜索"pad",岂不是return
a "true" 哪个错误?
不,这不会 return 正确。如果是这样,要么你的代码中有错误,要么你不理解 trie 的概念。
如果您插入 "bad" 和 "parent",则 trie 将如下所示:
(root)->b->a->d
|
+---->p->a->r->e->n->t
"pad" 不会被发现
不完全是。正如您正确指出的那样,Trie 通常使用递归结构(复合模式)实现。然而,这正是阻止它为 "pad" 返回 true 的原因,因为在插入 "parent" 之后,结构看起来像
root
b
a
d
p
a
r
e
n
t
所以在 Trie 之后,任何以 "p" 开头的东西都不会在 "d" 上出现。
不过,在 Trie 实现中通常还有另一个挑战,这需要最后一步来确定您是否真的找到了一个完整的单词或只是一个前缀。这正是 isWord 变量在您的示例中的用途。因此,在遍历节点后,您必须测试 属性.
class Node{
Map<Character,Node> childMap = new HashMap<>();
boolean isWord;
}
一个trie数据节点通常表示为如上class。 假设我们插入了
- "bad"
- "parent"
进入特里。
如果在trie中搜索"pad",岂不是return
a "true" 哪个错误?
不,这不会 return 正确。如果是这样,要么你的代码中有错误,要么你不理解 trie 的概念。
如果您插入 "bad" 和 "parent",则 trie 将如下所示:
(root)->b->a->d
|
+---->p->a->r->e->n->t
"pad" 不会被发现
不完全是。正如您正确指出的那样,Trie 通常使用递归结构(复合模式)实现。然而,这正是阻止它为 "pad" 返回 true 的原因,因为在插入 "parent" 之后,结构看起来像
root
b
a
d
p
a
r
e
n
t
所以在 Trie 之后,任何以 "p" 开头的东西都不会在 "d" 上出现。
不过,在 Trie 实现中通常还有另一个挑战,这需要最后一步来确定您是否真的找到了一个完整的单词或只是一个前缀。这正是 isWord 变量在您的示例中的用途。因此,在遍历节点后,您必须测试 属性.