【发布时间】:2013-07-21 18:17:48
【问题描述】:
我对在字典中使用 Tries/SortedSets 有一些疑问。
- 哪个查找效率更高?
- 哪个对虚拟内存更有效?
- 当用于字典时,这两种结构是否还有其他优点/缺点?
这三个都不需要回答,如果有的话,只需要寻找一些好的答案和源材料。谢谢。
【问题讨论】:
标签: memory data-structures complexity-theory hashset trie
我对在字典中使用 Tries/SortedSets 有一些疑问。
这三个都不需要回答,如果有的话,只需要寻找一些好的答案和源材料。谢谢。
【问题讨论】:
标签: memory data-structures complexity-theory hashset trie
Trie 中的查找速度非常快,因为它们只需要 O(length of key) 比较,并且几乎是尽可能快的。 SortedSet 通常使用平衡二叉搜索树来实现,这将执行更多的比较,在最坏的情况下O(height of tree) 字符串比较。所以 Trie 显然是这里的赢家。
虚拟内存效率可以看作是数据结构加载到内存中的速度。 SortedSet 占用的空间与元素的数量成正比。它是使用指针实现的,这可能对加载效率不利。这可以通过将其序列化并将其存储在数组中来改进,但这会增加所需的空间。最简单形式的 Trie 占用大量内存。它也是使用指针实现的,这同样不利于加载效率。即使序列化,也需要大量的内存。但是这里有一些有趣的替代方案,它们可以压缩特里树并提供相同的性能。 基数尝试占用的内存量明显减少。更好的是,DAWG(有向无环词图)与常见的后缀和前缀重叠,并大量压缩字典。压缩后,DAWG 占用的空间可能比您的字典本身要少。它是使用数组实现的,因此加载速度也很快。最后,如果你有一个静态字典,DAWG 将是最好的选择,否则取决于。
trie 将键视为序列。它是一个前缀树。您可以非常快速地获取从前缀开始的所有单词。使用 trie,您可以有效地执行自动完成和自动更正。浮点数等一些键可能会导致 trie 中的长链,这是不好的。 SortedSet 将键视为可比较的项目。因此很容易对元素进行分区。 SortedSet 和 Trie 都可以按字母顺序提供键,但我想 SortedSet 会快得多。
【讨论】: