【问题标题】:Quadratic probing: (f(k) + a*j + b*j^2) % M, How to choose a and b?二次探查:(f(k) + a*j + b*j^2) % M,如何选择a和b?
【发布时间】:2009-09-16 11:22:29
【问题描述】:

如果 M 是素数,如何选择 a 和 b 以最小化碰撞?

在书中也写到,要在 (f(k)+j^2) % M 中进行二次探测时找到空槽,哈希表必须至少有一半是空的?谁能给我一个证明?

【问题讨论】:

  • 听起来像是一道作业题……
  • -1 用于愚蠢的标签...请下次考虑!
  • @tanascius:您必须对问题评分 - 而不是它的标签。如果你对他们有问题 - 改变他们。不要太激进。
  • @kamarey:标签属于问题 - 所以我也判断它们。仅仅输入一个完整的句子作为标签是不够的。这使得标签系统一文不值。
  • @aditya:作为一般经验法则:使用以前使用过 30 次以上的标签。在创建新标签之前三思。

标签: math hash


【解决方案1】:

wikipedia上有一些选择a和b的值:

对于素数 M > 2,a 和 b 的大多数选择将使 f(k,j) 与 [0,(M − 1) / 2] 中的 j 不同。此类选择包括 a = b = 1/2、a = b = 1 和 a = 0,b = 1。因为给定元素只有大约 M/2 个不同的探针,所以很难保证插入会成功当负载系数 > 1/2 时。

保证找到空槽的证明是herehere

【讨论】:

  • 在维基百科上,如果素数表大小是 2^m ,那么他们给出了一些 a & b 的值,但是选择素数表大小为 2^m,它将仅取决于最后 m 位是个糟糕的选择
  • 我不确定我是否理解正确。他们给出了 2^m 的例子(在维基百科中 m 是 n)。但是下一段他们谈论的是质数 M > 2(在维基百科中,他们将 M 写为 m)。这就是我引用的段落。
  • 我是说哈希表的大小必须是素数,但如果我们是 2^m 那么它就不是素数了
  • 是的,应该是素数。在维基百科中,他们有两个案例。第二个是关于素数的。应该没问题。
  • @tanascius。非常感谢你。第一个链接不起作用:/
猜你喜欢
  • 2021-04-09
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多