Memory 使用Trie或SortedSet作为字典?

Memory 使用Trie或SortedSet作为字典?,memory,data-structures,complexity-theory,hashset,trie,Memory,Data Structures,Complexity Theory,Hashset,Trie,我对如何使用Tries/sortedset来编写字典有一些疑问 哪个查找更有效 对于虚拟内存,哪个更有效 当用于词典时,这两种结构是否还有其他优点/缺点 不需要回答所有三个问题,只要寻找一些好的答案和源材料(如果有的话)。谢谢 Trie中的查找速度非常快,因为它们只需要O(键的长度)比较,而且几乎尽可能快。SortedSet通常使用平衡的二进制搜索树来实现,在最坏的情况下,O(树的高度)string比较,这将执行更多的比较。所以Trie显然是这里的赢家 虚拟内存效率可以看作是数据结构加载到内存中

我对如何使用Tries/sortedset来编写字典有一些疑问

  • 哪个查找更有效
  • 对于虚拟内存,哪个更有效
  • 当用于词典时,这两种结构是否还有其他优点/缺点
  • 不需要回答所有三个问题,只要寻找一些好的答案和源材料(如果有的话)。谢谢

  • Trie中的查找速度非常快,因为它们只需要
    O(键的长度)
    比较,而且几乎尽可能快。SortedSet通常使用平衡的二进制搜索树来实现,在最坏的情况下,
    O(树的高度)
    string比较,这将执行更多的比较。所以Trie显然是这里的赢家

  • 虚拟内存效率可以看作是数据结构加载到内存中的速度。SortedSet占用的空间与元素数量成比例。它是使用指针实现的,这可能对加载效率有害。这可以通过序列化它并将其存储在数组中来改进,但这会增加所需的空间。最简单的Trie需要大量内存。它还使用指针实现,这同样不利于加载效率。即使序列化,也会占用大量内存。但是这里有一些有趣的替代方案,它们压缩了trie并提供了相同的性能基数尝试占用的内存量显著减少。更好的是,一个DAWG(有向无环单词图)与常见的后缀和前缀重叠,并对字典进行大量压缩。压缩后,DAWG占用的空间可能比字典本身要小。它是使用数组实现的,因此加载速度也很快。最后,如果你有一个静态字典,DAWG将是最好的方法,否则要视情况而定

  • trie将键视为序列。它是一个前缀树。您可以非常快速地获取所有以前缀开头的单词。使用trie,您可以高效地执行自动完成和自动更正。一些键,比如浮点数,可能会导致trie中的长链,这是不好的。SortedSet将钥匙视为可比较的项目。因此,很容易划分元素。SortedSet和Trie都可以提供按字母顺序排列的键,但我想SortedSet会快得多

  • 也许会有帮助?一个标注:在1号上,“所以Trie是这里的赢家。”从我发现的情况来看,排序集的查找效率是O(log(n))。因此,对于像“恐龙”(8个字符)这样的搜索词,您的字典必须有超过1亿(10^8)个单词才能使trie更有效。