【问题标题】:How is data retrieved from hash tables for collisions如何从哈希表中检索数据以进行冲突
【发布时间】:2016-03-15 04:06:39
【问题描述】:

我了解哈希表旨在在存储大量数据时轻松排序和检索数据。但是,在检索特定数据时,如果由于碰撞而将它们存储在其他位置,他们如何检索呢?

假设有 10 个索引,数据 A 存储在索引 3 中,数据 E 发生冲突,因为数据 A 已经存储在索引 3 中,而冲突预防将其放在索引 7 中。当需要检索数据 E 时,它如何检索 E 而不是使用第一个哈希函数并检索 A 呢?

对不起,如果这是一个愚蠢的问题。我对编程还是有点陌生​​。

【问题讨论】:

  • 对于 hastable,每个桶都有一个值列表。哈希函数到头元素,然后迭代列表。
  • 回到大学(1970 年代后期)我了解了哈希表,如果第一个桶被占用,算法会在其中找到另一个桶。我从未见过它们被使用过。链接(每个桶都有一组值,而不仅仅是一个,如果有“冲突”,你只需向集合中添加一个新值)是做事的标准方式,你必须有一个很好的理由以其他方式进行。
  • 哈希表与排序无关。
  • 我知道它们没有排序。我的意思是说它们以系统的方式放置在哈希表中。所以在某种程度上它们是被排序的,但不是通过编程中排序的字面定义。

标签: java hash hashtable


【解决方案1】:

我不相信 Java 会通过将项目移动到不同的存储桶来解决哈希冲突。这样做会使确定应该散列到的正确存储桶(如果不是不可能的话)变得困难。如果您仔细阅读this SO article,您会注意到它指出了Java 可以使用的两个工具。首先,它维护每个桶*的值列表(阅读下面的注释)。其次,如果列表变得太大,可能会增加存储桶的数量。

我相信该列表现在已替换为一棵树。这将确保O(n*lgn) 在最坏情况下的查找、插入等性能,而对于列表,最坏情况下的性能是O(n)

【讨论】:

  • 蒂姆给出了很好的解释。你应该接受这个答案。我认为 brbalin 被 Java8 语句通过在特定阈值后从列表切换到树来解决冲突感到困惑。
  • 如果通过双散列函数或探测来防止碰撞怎么办?
  • 当然这是可能的,但我认为 Java 集合不会这样做。
  • 我知道它没有,但我想知道如果进行了双重哈希或探测,它将如何处理检索。
  • @btrballin 我认为关于哈希表的维基百科文章解释了它是如何完成的。很可能,这里很少有人会知道答案而不在维基百科中查找它。只是不使用那些类型的哈希表。
猜你喜欢
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 2017-08-30
  • 2014-05-10
  • 2019-03-17
相关资源
最近更新 更多