Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 排序迭代是Trie的固有特性还是由实现来提供?_Java_Algorithm_Data Structures_Trie_Prefix Tree - Fatal编程技术网

Java 排序迭代是Trie的固有特性还是由实现来提供?

Java 排序迭代是Trie的固有特性还是由实现来提供?,java,algorithm,data-structures,trie,prefix-tree,Java,Algorithm,Data Structures,Trie,Prefix Tree,关于维基百科: [与哈希表相比]尝试支持有序迭代 首先,我不知道这里是什么意思。与排序迭代相同吗? 此外,这是该数据结构的固有特征吗? 我的意思是,如果对Trie中每个节点的子节点使用HashSet,我们可以通过尝试查找要分支的子节点获得O(1)访问权限,或者通过使用LinkedList可以节省节点上的空间。 也许我错了,但从我的观点来看,支持有序迭代的唯一方法是保持每个节点的所有键的数组甚至不使用。 这种方法不坏吗? 最后一点: 如果此处排序的与插入顺序(且未排序)相关,我们将如何获得它,因为

关于维基百科:

[与哈希表相比]尝试支持有序迭代

首先,我不知道这里是什么意思。与排序迭代相同吗?
此外,这是该数据结构的固有特征吗?
我的意思是,如果对
Trie
中每个节点的子节点使用
HashSet
,我们可以通过尝试查找要分支的子节点获得
O(1)
访问权限,或者通过使用
LinkedList
可以节省节点上的空间。
也许我错了,但从我的观点来看,支持
有序迭代的唯一方法是保持每个节点的所有键的数组甚至不使用。
这种方法不坏吗?
最后一点:
如果此处排序的
与插入顺序(且未排序)相关,我们将如何获得它,因为我们将每个单词(使用字符作为键)插入到相应的节点,但我看不出这如何为我们提供有关插入顺序的信息?
有人能帮我把脑子里的这些事情弄清楚吗?

谢谢。

它的意思是已排序。如果不付出额外的努力,就无法从trie中获取插入顺序。不太清楚你所说的内在特征是什么意思。实现需要提供它(或提供对内部的访问),但这样做很简单

他们的意思是,对trie进行深度优先搜索将生成trie中按字典顺序排列的字符串输出

但是,是的,您是对的,这假设给定级别上的所有同级节点都是按字典顺序访问的,而这远远没有给出,特别是对于大字母表,通过哈希表实现子节点表是有意义的

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


但值得注意的是,即使子节点没有排序,通过trie进行字典排序的迭代也是可以承受的,因为在迭代过程中对它们进行排序的成本相对较低——每个trie节点中几乎没有子节点,因此迭代trie的总体性能仍然是O(n)预期时间–与哈希表相比,有序迭代有效地意味着对所有元素进行排序,这是一个O(n logn)操作。

只是一个猜测。但是trie中字符串的有序迭代意味着trie中每个字符串按照字母顺序进行迭代。如果trie包含bat-sat-cat和hat,您可以轻松地迭代trie并按字母顺序获取这些字符串。例如bat、cat、hat sat。是的,我理解。但如果必须将其作为Trie的一项功能提供,则该实现不应该对空间(使用
LinkedList
)或时间(使用
HashSet
)进行优化用于存储子对象?只要这些结构是有序的,那么它们就可以用来存储子对象,同时保持不变。我认为一个字符到节点的映射对于一个子数据结构或一个排序的链表来说就足够了。我不清楚你的“字符到节点映射”的方法。能不能给出一个小的示例代码来说明你的意思?我想用Java数据结构中的HashMap,其中键是一个字符,值是节点,节点的值是字符。但是如果这是一个固有的特性,那么这意味着“优化”是不可能的,比如使用
哈希集
链接列表
来存储子项?我不知道如何使用链接列表进行优化。在节点上使用散列集时,您仍然可以迭代所有“潜在”存储桶,并获得与常规存储桶类似的性能。使用
LinkedList
存储子级可以节省空间,因为我不必使用
数组[256]
来存储输入文本中不存在的字符。就时间而言,
HashSet
的推理是一样的,但这有什么好处呢?在每个级别上都有线性访问性能。。。这将比在各个方面使用平衡的常规树更糟糕。这不是线性访问!它是
O(K)
其中
K
是字母表的大小,它是一个常数,例如
O(256)
=
O(1)
你的意思是
排序
在跟踪trie时我访问的每个节点上的子节点?