【问题标题】:Trie iterator, suffix orderingTrie 迭代器,后缀排序
【发布时间】:2013-03-12 14:27:21
【问题描述】:

我需要为 trie 实现一个迭代器。假设我有

    a
    /\
   b  c
  /\
 d  e

如果当前的iterator.state="abd",我想有iterator.next.state="abe",然后是"ac"。在每个级别,节点按字典顺序排序(例如,在级别 2,c 位于 b 之后)。这也应该在 log(n) 时间内发生,其中 n 是节点数。

我能想到的一个解决方案是:考虑一种特殊情况,即每个分支具有相同的高度。我认为一个相当酷的实现是为每个“级别”维护一个平衡的树。在询问:“abd 之后是什么字符串”时,当定位在 b 上时,可以在与第三级关联的树中搜索大于“b”的第一个元素,给出“abe”。

但这可能不切实际,因为必须创建树。

【问题讨论】:

  • @NickVeys homework - “此标签已过时,正在被删除。请不要将此标签添加到问题中。”
  • 你是如何实现每个 trie 节点的?通常一个级别中的节点已经排序,因为每个节点只是一个指向下一个节点的数组,每个数组都有你的字母大小。

标签: algorithm search trie


【解决方案1】:

如果我正确理解了这个问题,迭代器状态可能是当前字符串和指向树中当前位置的指针。然后,移动到下一个元素:

  1. 如果您的当前位置有兄弟,则移动到该位置并将当前字符串中的最后一个字符替换为当前位置的字符。

  2. 否则,删除最后一个字符并上树。如果你试图从根部向上,你就完成了。否则,请转到步骤 1。

因此,例如,当您在 abd(在您的示例中)时,当前字符串是“abd”并且指针指向“d”。要移动到下一个元素,请将字符串更改为“ab”,移动到兄弟节点('e')并将其添加到字符串中,产生“abe”。之后,由于没有兄弟姐妹,您将向上上升,然后上升到 b 的兄弟姐妹,产生正确的下一个值 'ac'。

如您所见,最坏的情况是,这些步骤中的每一个都需要一直回到根目录才能找到同级;这就是你要的 log(n)。

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2021-01-12
    • 2013-01-11
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多