【问题标题】:Trie ending at current node or node after尝试在当前节点或节点之后结束
【发布时间】:2016-12-27 07:25:41
【问题描述】:

鉴于 trie 具有这样的节点:

struct TrieNode {
    map<char, TrieNode> children; 
    bool endOfWord = false;

    TrieNode() {}
};

endOfWord 布尔值在词尾为真会更好吗(案例 1)

c-a-[t] &lt;--- endOfWord = true;

或者创建一个空的 char 节点并在那里有 endOfWord(案例 2)

c-a-t-[ ] &lt;--- endOfWord = true;

从我看到的所有教程中,他们推荐后一种选择,但这不会让事情变得更加混乱吗?对于包含 beckoned 和 beckon 的 trie,案例 1 看起来像

b-e-c-k-o-[n]-e-[d]

但情况 2 会有

b-e-c-k-o-n-[e]-d-[ ]

或者这仅仅是我的 trie 是如何实现的?

【问题讨论】:

    标签: c++ data-structures


    【解决方案1】:

    我会使用字母上标记的第一个词尾而不是后继词。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 如果子地图包含某个字符,它会表示单词的结尾?
        • 是的。代码点零可能是一个不错的选择,因为它通常用作 C 中的字符串终止符
        猜你喜欢
        • 2013-03-27
        • 1970-01-01
        • 2011-12-23
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多