哪种数据结构最适合实现Dictionary
Which data structure is most suitable to implement a Dictionary?
我必须编写一个Dictionary程序,作为数据结构和算法本科课程的学期项目,我希望能找到最适合这个问题的解决方案(数据结构)。
我考虑使用哈希表或trie。有人建议我使用treaps,但我还无法查看它们。
我的数据库有大约10万个不同的单词及其含义。该程序预计提供的基本功能是insert、update、remove[/strong>和搜索//strong>一个单词/定义。如果我能挤进自动完成和拼写修正,那将是一个额外的奖励。
因此,我的问题是,记住我的要求,哪种数据结构最适合我的目的。当我说"最好"时,我要求的是具有最佳运行时复杂性和低成本(内存需求)的数据结构。
此外,我希望能够有一个算法,返回所有以给定前缀开头的单词。例如,假设我调用一个函数dictionary.getWordsStartingWith("fic")
,它应该返回以fic
开头的所有单词的列表,如fiction
、fictitious
、fickle
等。我知道如果我将字典实现为trie,我可以做到这一点,但这可以用哈希表实现吗?
如果你想进行自动完成/前缀匹配,你几乎肯定想要一个trie。哈希表并不能真正实现这一点;事实上,好的散列函数被设计成即使是非常相似的密钥(例如,相同的前缀)也映射到数组的完全不同的部分。出于哈希目的,这被认为是一个功能。
树基本上是二进制搜索树,使用随机性+堆属性来进行平衡。一般来说,该接口是标准BST树接口;所以它实际上只是一个实现细节,只会导致与红黑树或AVL树适度不同的属性。
BST并不像trie那样适合你想要解决的问题。BST倾向于向下遵循不平等,而trie则是向下遵循平等。当你处理数字数据时,不等式比较就是一切,因为等式非常罕见(因为可能性的空间很大)。对于字符串,每个字符的可能性都很小,因此利用等式更有意义,从而实现优化,比如在大多数节点上不实际存储键。
总之,我建议继续尝试。它们正是被大量用于这类事情,你可以找到大量的资源来优化它们(尤其是在空间方面),因为它们特别用于移动设备上的文本输入,在移动设备上,空间/周期非常宝贵。学习IMHO也是一个非常有趣的数据结构,与BST相比,你a)可能在大一新生的数据结构中学到了很多,b)数据结构真的没有那么有趣吗;除了平衡方案之外的所有事情都是琐碎的,平衡方案比其他任何事情都更乏味(RB树有大约7种真正不同的平衡情况,很难对RB树进行编码并使其完全正确)。
维基百科页面有一些好的信息:https://en.wikipedia.org/wiki/Trie.Bitwise的尝试看起来特别有趣。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 哪种数据结构最适合实现Dictionary