即将做作业,我需要在我选择的数据结构中存储大量信息(Dictionary)。我听到教室里有人说哈希表是要走的路。怎么样?
答案 0 :(得分:3)
<强>优点强>
当你第一次听到哈希表时,它们听起来好得令人难以置信。原因在于搜索有多少项无关紧要,插入(有时删除)可以占用大约0(1),这几乎是来自用户POV的瞬间。鉴于其在速度方面的性能能力,哈希表主要用于但不限于需要在不到一秒的时间内查找数千个项目的程序(例如拼写检查器/搜索引擎)。从我的特定观点来看,我发现H表比任何类型的二叉树更容易编程,并且不是专家,所以如果你是一个初学者,那可能也是一个优势。
<强>缺点强>
由于哈希表基于数组,因此一旦创建就很难扩展。此外,我已经读过,对于某些哈希表,一旦满了,或者在执行任务时速度变得越来越快。由于两者在编程时都需要相当准确地确定需要存储的项目数量。另外不可能搜索哈希表中的项目,例如从最小到最大,所以如果你正在寻找它可能不是你需要的。
额外信息
维基百科文章 - Hash Table - Big O Notation
哈希表教程 - Tutorial
所有关于哈希表的方法 - Java2S
预订建议
我建议你拿一本名为“Java中的数据结构与算法 - 第二版 - 罗伯特·拉弗”的书,这是一本很大的书,但它解释得非常微妙,对我来说是唯一的编程书所以我可以读到就像是一部小说。
有关Big O表示法的其他信息 - O(1)
O(1)并不意味着“非常即时”(O(1)算法可能需要数小时,数周或数年)。这意味着(在这种情况下)“与集合的大小无关”(假设哈希码足够好)。 - Ben Lings
感谢Ben的澄清。
P.S:当你提出一个问题时,你可能想要更具描述性,以便其他用户可以指出你想要的东西。
答案 1 :(得分:3)
答案 2 :(得分:3)
你的词典的最佳结构是Prefix tree,其中每个节点的'key'是来自你的一个单词的字母,每个节点的'value'是单词的意思(字典翻译)。单词查找在单词的长度上是线性的(与散列表相同,因为您的散列函数理想地是线性的),或者如果我们将单词视为一个整体则为O(1)。比散列表更好的是散列表将占用大量空间以确保O(1)访问,并且根据字典中的单词,它可能非常稀疏地填充。另一方面,前缀树实际上提供压缩 - 树本身将包含比以前更少空间的所有原始信息,因为单词的公共部分沿树结构共享。字典通常有数万个字,留下前缀树是唯一可行的解决方案。
P.S。如前所述,与哈希表相比,树具有几乎无限的可伸缩性。
答案 3 :(得分:2)
这取决于您要存储的内容以及您希望如何访问它。你没有真正提供足够的信息。
哈希表提供O(1)查找时间,因此可以非常快速地使用它们来基于密钥检索值。如果散列算法很昂贵,您可能会发现它的性能优于其他数据结构。如果您正在从结构中插入和删除大量项目,则尤其如此。
答案 4 :(得分:2)
如果您计划使用Java库中的哈希表实现,请务必注意其中有两个--HashTable和HashMap。其中一种是目前常用的,其中一种已经过时,通常在遗留代码中找到。做一些研究,找出哪个更好,为什么新的更好。
答案 5 :(得分:1)
哈希表允许您将键映射到对象。
如果您要存储具有唯一键的值,并且您需要按键查找值,则可以使用哈希表。
如果您只想存储一组没有唯一键的有序对象,则可以使用普通的ArrayList
。 (特别要注意普通哈希表是无序的)
答案 6 :(得分:1)
哈希表是不错的选择,但在使用它时你可能必须决定什么是好的哈希函数..这个问题可以有很多答案,取决于程序员。我个人觉得你可以查看B +树或Trie。 Trie的主要用途之一是字典表示。Trie in Wiki
希望这会有所帮助!!