鉴于trie有这样的节点:
struct TrieNode {
map<char, TrieNode> children;
bool endOfWord = false;
TrieNode() {}
};
endOfWord bool在单词结尾处是真的会更好(案例1)
c-a-[t] <--- endOfWord = true;
或创建一个空的char节点并在那里使用endOfWord(case 2)
c-a-t-[ ] <--- endOfWord = true;
从我看到的所有教程中,他们推荐后一种选择,但这不会让人感到困惑吗?对于包含招手和召唤的特里,案例1看起来像
b-e-c-k-o-[n]-e-[d]
但案例2会有
b-e-c-k-o-n-[e]-d-[ ]
或者这仅仅是我的特里是如何实施的?
答案 0 :(得分:0)
创建表示grapf叶子的其他对象有什么意义?在任何算法实现中,您都必须检查endOfWord
是否设置为true
或false
。引入额外的对象层不会使实现更容易,它会导致内存浪费。
答案 1 :(得分:0)
我会选择字母上标记的第一个字词而不是后继字符。
主要原因:在搜索时,不需要寻找空的EoW后继者 - 节省CPU时间(特别是如果空节点需要在CPU缓存中加载,但这可以通过使用单个终结器节点来缓解)。也就是说,除非有人需要从孩子那里反馈父母 - 如果我能想象为什么会有人需要,请打败我。)
答案 2 :(得分:0)
一个原因可能是,如果您使用特殊字符(例如代码点0),则根本不需要字结束标志。