【问题标题】:Hash Tables - Java哈希表 - Java
【发布时间】:2010-03-21 15:31:10
【问题描述】:

我即将做作业,我需要在我选择的数据结构中存储大量信息(字典)。我听到我教室里的人说哈希表是要走的路。怎么会?

【问题讨论】:

  • 视情况而定。你想存储什么?
  • 请提供更多信息,各种数据结构适用于各种用途,具体取决于您要做什么。

标签: java oop data-structures hashtable


【解决方案1】:

优势

当您第一次听说哈希表时,它们听起来好得令人难以置信。原因是无论搜索多少项目,插入(有时删除)可能需要大约 0(1),这几乎是用户 POV 的瞬时值。鉴于其在速度方面的性能能力,哈希表主要用于但不限于需要在不到一秒的时间内查找数千个项目的程序(例如拼写检查器/搜索引擎)。从我的特定角度来看,我发现 H 表比任何类型的二叉树都更容易编程,而且我不是专家,所以如果你是初学者,这可能也是一个优势。

缺点

由于哈希表是基于数组的,因此一旦创建它们就很难扩展。我也读过,对于某些哈希表,一旦满或满了,执行任务时的速度就会大大降低。由于这两种情况,在编程时您需要相当准确地确定需要存储多少项目。此外,无法按例如从最小到最大的顺序搜索哈希表中的项目,因此如果这是您正在寻找的东西,它可能不是您需要的。


额外信息

维基百科文章 - Hash Table - Big O Notation

哈希表教程 - Tutorial

关于哈希表的所有方法 - Java2S


图书建议

我建议你买一本名为“Data Structures & Algorithms in Java - Second Edition - Robert Lafore”的书,它是一本大书,但它对所有内容的解释都非常微妙,对我来说是迄今为止唯一的编程书我可以像小说一样阅读。


关于大 O 表示法 - O(1) 的其他信息

O(1) 并不意味着“几乎是瞬时的”(O(1) 算法可能需要数小时、数周或数年)。这意味着(在这种情况下)“与集合的大小无关”(假设哈希码足够好)。 – 本灵斯

感谢 Ben 的澄清。


P.S:将来当您提出问题时,您可能希望更具描述性,以便其他用户可以准确指出您要查找的内容。

【讨论】:

  • O(1) 并不意味着“几乎是瞬时的”(O(1) 算法可能需要数小时、数周或数年)。这意味着(在这种情况下)“与集合的大小无关”(假设哈希码足够好)。
  • 没错,O(1) 是常数时间。我的意思是,对于用户来说几乎是瞬时的(引用自 Java 中的数据结构和算法一书)。不过感谢您的澄清。
【解决方案2】:

为了帮助您决定哪种类型的集合更适合您,请查看以下 Java 教程课程:

Lesson: Introduction to Collections

阅读本文,您可以了解哪个系列适合您的需求。

【讨论】:

  • @Spike Williams:毫无疑问。也许是掌握 Java 语言基础知识的最佳人选。
【解决方案3】:

您的字典的最佳结构是Prefix tree,其中每个节点的“键”是您的单词中的一个字母,每个节点的“值”是单词的含义(字典翻译)。单词查找在单词的长度上是线性的(与哈希表相同,因为您的哈希函数理想情况下是线性的),或者如果我们将单词视为一个整体,则 O(1)。比散列表更好的是散列表将占用大量空间以确保 O(1) 访问,并且根据字典中的单词,它可能非常稀疏。另一方面,前缀树实际上提供了压缩——树本身将在比以前更小的空间中包含所有原始信息,因为单词的公共部分沿树结构共享。字典通常有数万个单词,前缀树是唯一可行的解​​决方案。

附:如前所述,与哈希表相比,树具有几乎无限的可扩展性。

【讨论】:

    【解决方案4】:

    这取决于您要存储的内容以及访问方式。您确实没有提供足够的信息。

    哈希表提供 O(1) 的查找时间,因此它们可以用于非常快速地根据键检索值。如果散列算法很昂贵,您可能会发现它的性能优于其他数据结构。如果您要从结构中插入和删除大量项目,则尤其如此。

    【讨论】:

    • 从技术上讲,查找时间是 O(n) 而不是 O(1)(因为理论上可能哈希图中的每个项目都与您要查找的项目具有相同的哈希码),但在练习它更接近 O(1)(给定一个不错的散列函数)。
    • @sepp2k 请参阅第 259 页的“算法简介”以证明在哈希表中,通过链接搜索来解决冲突的平均时间为 O(1)
    【解决方案5】:

    如果您计划使用 Java 库中的哈希表实现,请务必注意其中有两个 - HashTable 和 HashMap。其中一种是当今常用的,另一种是过时的,通常在遗留代码中找到。做一些研究,找出哪个是哪个,以及为什么新的更好。

    【讨论】:

      【解决方案6】:

      哈希表允许您将键映射到对象。

      如果您要存储具有唯一键的值,并且您需要通过键来查找值,那么哈希表就是最佳选择。
      如果您只想存储一组没有唯一键的有序对象,那么普通的ArrayList 是可行的方法。 (特别注意普通哈希表是无序的)

      【讨论】:

        【解决方案7】:

        哈希表是不错的选择,但在使用它时,您可能必须决定什么是好的哈希函数。这个问题可以有很多答案,并且取决于程序员。我个人觉得你可以查看 B+ 树或 Trie。 Trie 的主要用途之一是字典表示。Trie in Wiki

        希望对你有帮助!!

        【讨论】:

          猜你喜欢
          • 2018-10-13
          • 2014-02-01
          • 1970-01-01
          • 2021-09-14
          • 2011-07-23
          • 2013-05-31
          • 2016-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多