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

时间:2015-12-26 17:38:07

标签: c++ data-structures hashtable trie treap

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

我考虑使用哈希表 trie 。我被建议某人使用 treaps 但尚未查看它们。

我的数据库有大约10万个不同的单词及其含义。该计划预期提供的基本功能是 插入 更新 删除< / em> 搜索 一个字/定义。如果我设法挤进自动完成拼写纠正,这将是一个额外的奖励。

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

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

1 个答案:

答案 0 :(得分:3)

如果你想做自动完成/前缀匹配,你几乎肯定想要一个特里。哈希表并不能真正实现这一点;实际上,设计了良好的散列函数,使得甚至非常相似的键(例如,相同的前缀)映射到阵列的完全不同的部分。对于散列目的,这被视为一项功能。

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

BST并不适合你似乎想要解决的问题。 BST倾向于完全关注不平等下行,而特里are则追求平等下行。当你处理数字数据时,不等式比较就是一切,因为平等是非常罕见的(因为可能性的空间很大)。对于字符串,每个字符的可能性非常小,因此利用相等性更有意义,从而导致优化,例如不在大多数节点上实际存储密钥。

总之,我建议继续尝试。它们非常适用于这种类型的东西,你可以找到大量资源来优化它们(尤其是空间),因为它们特别用于移动设备上的文本输入,其中空间/周期非常宝贵。这也是一个非常有趣的数据结构,学习恕我直言,相比于你可能a)可能在新生数据结构中学到很多的BST,和b)数据结构真的不那么有趣;除了平衡方案之外的其他一切都是微不足道的,平衡方案比其他任何东西都更繁琐(RB树有7个真正不同的平衡或类似的东西,很难编码RB树并使它们完全正确)。

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