二次探测不会触及素数哈希表中的所有元素

时间:2014-03-17 05:33:48

标签: java data-structures hash hashtable quadratic-probing

假设我有一个包含59个元素的哈希表(每个元素值都是一个整数)。索引15为空白,表格的其余部分充满了数据。根据我想要插入的数字,二次探测公式永远不会出现在元素15中!

假设我想插入数字199(使用下面的hashFunc()函数将其哈希到22:

public int hashFunc(int key)
{
    return key % arraySize; //199 % 59 = 22
}

public void insert(DataItem item)
{
    int key = item.getKey();      // extract the key (199)
    int hashVal = hashFunc(key);  // hash the key (22)
    int i = 1;

    //The while loop just checks that the array index isn't null and isn't equal to -1 which I defined to be a deleted element

    while(hashArray[hashVal] != null && hashArray[hashVal].getKey() != -1)
    {
        hashVal = hashFunc(key) + (i * i); //This never hits element 15!!!
        i++;
        hashVal %= arraySize;      // wraparound when hashVal is beyond 59
    }

    hashArray[hashVal] = item;    // insert item
}

1 个答案:

答案 0 :(得分:3)

这是在二次探测哈希表中预期的。 Using some modular arithmetic,您可以证明探测序列中只有第一个p / 2探测位置保证是唯一的,这意味着每个元素的探测序列可能不会访问表中的一半位置。

要解决此问题,您应该更新代码,以便在p / 2或更多表位置正在使用的任何时候重新进行更新。或者,您可以使用维基百科文章中建议的交替探测偏移符号(+ 1,-4,+ 9,-16,+ 25等)的技术,这应该确保您可以击中每个可能的位置

希望这有帮助!