【问题标题】:Uniform Hashing Function for a dynamic hash table动态哈希表的统一哈希函数
【发布时间】:2013-01-09 19:40:32
【问题描述】:

我正在尝试编写一个简单的整数哈希表类。我希望它是动态的,因为当它充满时,它的大小会增加一倍。 我似乎找不到可以正常工作的散列函数。我已经尝试使用以下函数进行双重哈希(但它不起作用): h(k)=(x%7 +1+ k*(x%5))%(Table_Size)

我缺少的任何好东西都可以吗?

【问题讨论】:

  • 为什么不起作用,x 是什么?
  • 很难想出好的散列函数。我假设您正在寻找一个真正支持O(1) 操作的哈希表?然后,您将需要一组随机(但确定性)的哈希函数来实际实现这一点(理论上)。
  • 是的,我想实现 O(1) 操作。所以我唯一不使用通用散列的选择就是使用链散列来实现这一点?

标签: c++ hash hashtable


【解决方案1】:

对于简单的整数,不要对数字本身进行哈希处理(这样做不会生成任何好的新属性),而是使用质数来确定哈希表的大小(这将提供良好的均匀分布用于您的条目).. 通常,使用素数作为哈希表大小是一种很好的做法,无论您使用什么以及如何进行哈希处理。

退房

http://planetmath.org/GoodHashTablePrimes.html

随着表格的增长,可以使用合适的尺寸列表。

【讨论】:

  • 但我还需要找到那些素数。这不会损害重新散列的摊销复杂性吗?
  • 不是真的,这是一个包含所有您需要的数字的相当短的列表,因此您只需将列表存储为静态数组并在需要增长时遍历它。与更改哈希表大小时需要进行的重新索引相比,这样做的成本非常低。而且当你使用这种方法时,表格的分布很好,所以你在查找条目时会很快弥补那个小的 for 循环:)
  • 但是如果我需要一个比它更大的哈希表,它就行不通了。我需要一些永远有效的东西。
  • 如果您确实需要具有超过数十亿条记录的哈希表,扩展该列表并不难。您已经在谈论使用比现代机器上通常可用的内存更多的内存。但是假设你这样做了,然后通过选择 2^n 和 2^(n+1) 之间的素数来扩展表格,找到该序列中的下一个素数,直到你需要的最大数字,比如 2^64实例..
  • 不管你最终做什么,不要散列整数,它对你没有任何好处。散列某些东西的唯一原因是将其更改为一个整数,尽可能多地使它们均匀分布。但是如果给定一个整数,您已经具有该特征! (毕竟 x 总是会散列到相同的 h(x)..)
猜你喜欢
  • 2016-03-25
  • 2011-02-27
  • 2011-11-28
  • 2019-07-22
  • 2017-01-22
  • 2010-10-12
  • 2020-10-07
  • 2021-01-23
  • 2021-01-19
相关资源
最近更新 更多