帮助哈希表和Java中的二次探测

时间:2010-04-10 12:34:33

标签: java insert find hashtable quadratic-probing

我真的需要帮助插入哈希表。我现在还没完全搞定。有人可以解释外行人的二次和线性探测吗?

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  ********
    }
}

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

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

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

  • v,用于计算哈希码的对象的值。
  • ti*f其中i,称为 stepsize ,如果发生冲突,您每次都会向哈希函数添加f是到目前为止达到的碰撞次数。

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

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

第一个是线性函数,第二个是二次(这里是这个tecnique的名字)..你应该知道{{1 }},% nc是选择常量以获得更好的哈希函数..

实际上讲线性探测:

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

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