【问题标题】:Help with hash tables and quadratic probing in Java帮助使用 Java 中的哈希表和二次探测
【发布时间】:2010-04-10 12:34:32
【问题描述】:

在插入哈希表方面我真的需要帮助。我现在还没有完全明白。有人可以通俗地解释二次和线性探测吗?

public void insert(String key)
{
    int homeLocation = 0;
    int location = 0;
    int count = 0;

    if (find(key).getLocation() == -1)  // make sure key is not already in the table
    {
       //****** ADD YOUR CODE HERE FOR QUADRATIC PROBING  ********
    }
}

这是我正在处理的代码。我不是要求任何人这样做,我只是真的需要帮助来学习整个概念

任何帮助将不胜感激。

【问题讨论】:

标签: java insert find hashtable quadratic-probing


【解决方案1】:

首先,我们讨论的是一种开放寻址(或封闭散列)方法。如果前一个哈希码已被另一个哈希码使用,则需要处理计算新哈希码的冲突,这是因为哈希映射的每个桶最多可以包含 1 个元素。

所以你有一个带有两个参数的散列函数:

  • v,用于计算哈希码的对象的值。
  • t,它是i*f,其中i,称为stepsize,是您每次在发生碰撞时添加到哈希函数的值,f 是迄今为止达到的碰撞次数。

从这里开始,您有两个可能的功能:

H(v, t) = (H(v) + t) % n
H(v, t) = (H(v) + c*t + d*t*t) % n

第一个是线性函数,第二个是二次函数(这里是这个技术的名称)..你应该知道什么% n也就是说,cd 被选择为具有更好哈希函数的常量..

实际上对于线性探测来说:

  • 你计算H(x, 0)
    • 如果单元格是空闲的,则将元素放在那里
    • 如果单元格被占用计算H(x, i)
      • 如果单元格空闲,则将元素放在新地址中
      • 如果单元格被占用则计算H(x, i+i)
        • 继续直到找到一个空单元格

对于二次探测,你所做的都是相同的,你从H(x,0)开始,然后是H(x,i),然后是H(x,i+i),不同的是所涉及的散列函数将赋予不同的权重步长。

【讨论】:

  • 其实你帮了我很多..我现在不在我的办公桌前偷看我的工作,但我更了解它
猜你喜欢
  • 2012-08-20
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多