【问题标题】:Is sorted iteration an inherent feature of a Trie or it is up to implementation to provide it?排序迭代是 Trie 的固有特性还是由实现来提供?
【发布时间】:2012-05-31 05:13:48
【问题描述】:

关于来自维基百科的Trie

[对比HashTable]尝试支持有序迭代

首先我不确定这里是什么意思。和排序迭代一样吗?
此外,这是否应该是此数据结构的固有特征?
我的意思是如果一个人使用例如HashSet 用于Trie 中每个节点的子节点,我们可以获得O(1) 访问权限,试图找到要分支的子节点,或者使用LinkedList 可以节省节点上的空间。
也许我错了,但从我的角度来看,支持ordered 迭代的唯一方法是保持每个节点的所有键数组甚至未使用。
这种方法不好吗?
最后一点:
如果这里的ordered 与插入顺序(而不是排序)有关,我们将如何得到它,因为我们将每个单词(使用字符作为键)插入到相应的节点,但我看不出这如何为我们提供有关广告订单?
有人能帮我把这些事情弄清楚吗?
谢谢。

【问题讨论】:

  • 只是猜测。但是 trie 中字符串的有序迭代意味着根据字母顺序对 trie 中的每个字符串进行迭代。如果 trie 包含 bat sat cat 和 hat,您可以轻松地遍历 trie 并按字母顺序获取这些字符串。例如。蝙蝠,猫,帽子坐。
  • 是的,我明白这一点。但如果这必须作为 Trie 的一个特性提供,那么实现不应该对空间(使用LinkedList)或时间(使用HashSet)进行优化存放孩子?
  • 只要这些结构是有序的,那么他就可以在持有该不变量的同时用来存储孩子。我认为一个字符到节点的映射对于子数据结构或排序链表就足够了。
  • 我不清楚你的方法“字符到节点映射”。是否可以给出一个小的示例代码来说明你的意思?
  • 我认为是Java数据结构中的HashMap,其中键是字符,值是节点,值是字符。

标签: java algorithm data-structures trie prefix-tree


【解决方案1】:

他们的意思是对 trie 的深度优先搜索将产生 trie 中字符串的字典顺序输出。

但是是的,你是对的,这假设给定级别上的所有兄弟节点都按字典顺序访问,这远非给定,尤其是对于大字母表,通过哈希实现子节点表是有意义的表。

总之,我认为你的怀疑是有道理的,维基百科的文章是错误的

但值得注意的是,在 trie 上按字典顺序迭代是负担得起的即使子节点没有排序,因为在迭代时对它们进行排序预计会相对便宜 - 会有每个 trie 节点中的子节点很少,因此迭代 trie 的整体性能仍将在 O(n) 预期时间内 - 与哈希表相反,其中有序迭代有效地意味着对 all 进行排序 个元素,一个 O(n log n) 操作。

【讨论】:

  • 你的意思是sort我在遍历树时访问的每个节点的孩子?
【解决方案2】:

表示排序。如果不付出额外的努力,您将无法尝试插入订单。不完全确定您所说的固有特征是什么意思。实现需要提供它(或提供对内部的访问),但这样做很简单。

【讨论】:

  • 但如果它是一个固有特性,那么这些意味着像使用HashSetLinkedList 来存储孩子这样的“优化”是不可能的?
  • 我不明白如何使用链表进行优化。在节点上使用哈希集时,您仍然可以遍历所有“潜在”存储桶并获得类似于常规 Trie 的性能
  • 使用LinkedList 来存储孩子可以节省空间,因为我不必拥有例如array[256] 用于存储输入文本中不存在的字符。就时间而言,HashSet 的推理相同
  • 但这有什么好处——你将在每个级别都有线性访问性能......这比在各个方面使用平衡的常规树更糟糕。
  • 不是线性访问!它是O(K),其中K 是字母表的大小,它是一个常数,例如O(256)=O(1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多