Trie在当前节点或节点之后结束

时间:2016-12-26 22:24:24

标签: c++ data-structures

鉴于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-[ ]

或者这仅仅是我的特里是如何实施的?

3 个答案:

答案 0 :(得分:0)

创建表示grapf叶子的其他对象有什么意义?在任何算法实现中,您都必须检查endOfWord是否设置为truefalse。引入额外的对象层不会使实现更容易,它会导致内存浪费。

答案 1 :(得分:0)

我会选择字母上标记的第一个字词而不是后继字符。

主要原因:在搜索时,不需要寻找空的EoW后继者 - 节省CPU时间(特别是如果空节点需要在CPU缓存中加载,但这可以通过使用单个终结器节点来缓解)。也就是说,除非有人需要从孩子那里反馈父母 - 如果我能想象为什么会有人需要,请打败我。)

答案 2 :(得分:0)

一个原因可能是,如果您使用特殊字符(例如代码点0),则根本不需要字结束标志。