【问题标题】:How is data retrieved from a HashTable in collision?如何在冲突中从 HashTable 中检索数据?
【发布时间】:2013-03-30 15:19:18
【问题描述】:

根据this,在哈希表中搜索的时间复杂度是O(1)。

但是,如果发生碰撞,那么显然这应该是 O(1) + 一些东西。

我的问题是:

当你说

get(someKey) 

从哈希表中,哈希函数应用于 someKey,并直接从该位置检索数据。

但假设Seperate Chaining 用于解决冲突。并想象 someKey 和 someOtherKey 在我们的散列函数应用于它们之后具有相同的输出。说它是值“25”。

所以当我说

get(someKey)

我将从位置“25”获取数据。这使它成为 O(1)。伟大的。

但是当我说

get(someOtherKey) 

现在 someOtherKey 已链接到 someKey 所在的位置。

当对 someOtherKey 应用散列时,我得到 25。

如何获得我需要的价值?内部是什么?还有别的表吗?算法流程如何?是否有其他表用于存储所有碰撞?

谢谢。我希望我的问题很清楚!

【问题讨论】:

  • 这是一个很好的资源:@​​987654323@

标签: hash hashmap hashtable hashcode hash-collision


【解决方案1】:

有许多不同的数据结构可以用来处理冲突。这是一个很好的总结。 http://en.wikipedia.org/wiki/Hash_table.

哈希函数将搜索范围缩小到数据结构中的单个bucket。然后存储桶包含另一个用于解决冲突的数据结构。它可以链接到一个数组,其中的键以排序或未排序的顺序维护。该链接可能指向键的链表中的第一个元素,或者指向 b 树的根节点。重要的一点是散列函数很快缩小了搜索范围。

一旦范围缩小,其他一些效率较低的搜索可能有助于解决冲突。这都是关于权衡的。您需要一种散列算法,它可以提供足够大的散列(和存储桶)范围以最大限度地减少冲突,但仅限于您可以承受的内存量。如果碰撞很少见,则通过碰撞链接列表进行线性搜索也不错。如果有很多冲突,那么为存储桶重新调整数组大小的效率就变得更加重要。

【讨论】:

  • 谢谢。所以哈希表保存桶,而不是直接保存值?
  • 这取决于实现。一些设计可能被构造为将一定数量的值直接保存在桶中的数据结构中,并且只有在桶满时才会溢出到二级结构。在桶中保留一个值,然后有一个指向任何辅助值的链表的指针特别有意义。所以实际上将链表的第一个节点保留在桶中。
  • 这也取决于值的大小。在库中实现的一般情况哈希表必须对许多可能的大小和值范围具有灵活性。如果事先知道数据集(值的数量、值的范围),则可以设计出比一般情况更有效的特定结构。很多工作只在边缘情况下才值得。
猜你喜欢
  • 2018-10-03
  • 1970-01-01
  • 2015-07-26
  • 2017-04-16
  • 2018-07-21
  • 1970-01-01
  • 2020-04-01
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多