哪种数据结构最适合实现Dictionary

Which data structure is most suitable to implement a Dictionary?

本文关键字:实现 Dictionary 数据结构      更新时间:2023-10-16

我必须编写一个Dictionary程序,作为数据结构和算法本科课程的学期项目,我希望能找到最适合这个问题的解决方案(数据结构)。

我考虑使用哈希表trie。有人建议我使用treaps,但我还无法查看它们。

我的数据库有大约10万个不同的单词及其含义。该程序预计提供的基本功能是insertupdateremove[/strong>和搜索//strong>一个单词/定义。如果我能挤进自动完成拼写修正,那将是一个额外的奖励。

因此,我的问题是,记住我的要求,哪种数据结构最适合我的目的。当我说"最好"时,我要求的是具有最佳运行时复杂性和低成本(内存需求)的数据结构。

此外,我希望能够有一个算法,返回所有以给定前缀开头的单词。例如,假设我调用一个函数dictionary.getWordsStartingWith("fic"),它应该返回以fic开头的所有单词的列表,如fictionfictitiousfickle等。我知道如果我将字典实现为trie,我可以做到这一点,但这可以用哈希表实现吗?

如果你想进行自动完成/前缀匹配,你几乎肯定想要一个trie。哈希表并不能真正实现这一点;事实上,好的散列函数被设计成即使是非常相似的密钥(例如,相同的前缀)也映射到数组的完全不同的部分。出于哈希目的,这被认为是一个功能。

树基本上是二进制搜索树,使用随机性+堆属性来进行平衡。一般来说,该接口是标准BST树接口;所以它实际上只是一个实现细节,只会导致与红黑树或AVL树适度不同的属性。

BST并不像trie那样适合你想要解决的问题。BST倾向于向下遵循不平等,而trie则是向下遵循平等。当你处理数字数据时,不等式比较就是一切,因为等式非常罕见(因为可能性的空间很大)。对于字符串,每个字符的可能性都很小,因此利用等式更有意义,从而实现优化,比如在大多数节点上不实际存储键。

总之,我建议继续尝试。它们正是被大量用于这类事情,你可以找到大量的资源来优化它们(尤其是在空间方面),因为它们特别用于移动设备上的文本输入,在移动设备上,空间/周期非常宝贵。学习IMHO也是一个非常有趣的数据结构,与BST相比,你a)可能在大一新生的数据结构中学到了很多,b)数据结构真的没有那么有趣吗;除了平衡方案之外的所有事情都是琐碎的,平衡方案比其他任何事情都更乏味(RB树有大约7种真正不同的平衡情况,很难对RB树进行编码并使其完全正确)。

维基百科页面有一些好的信息:https://en.wikipedia.org/wiki/Trie.Bitwise的尝试看起来特别有趣。