Double Hash函数导致无限循环

时间:2018-03-25 09:24:22

标签: java data-structures

我正在进行数据结构分配,我尝试增加双哈希函数会陷入无限循环。

我的书定义了将哈希加倍的策略

  

h'(k)= q-(k mod q),对于某些素数q <1。 N.另外,N   应该是一个素数。

我已经确定双重哈希增量导致问题,因为切换到线性探测运行正常。

private int findSlot(int h, K k) {
    totalProbes = 0;
    int avail = -1;                               // no slot available (thus far)
    int j = h;                                    // index while scanning table
    do {
        totalProbes++;
        if (totalProbes > maxProbes) maxProbes = totalProbes;
        if (isAvailable(j)) {                       // may be either empty or defunct
            if (avail == -1) avail = j;               // this is the first available slot!
            if (table[j] == null) {
                break;
            }                                           // if empty, search fails immediately
        } else if (table[j].getKey().equals(k))
            return j;                                 // successful match
       //j = (j + 1) % capacity;                       // keep looking (cyclically)
        j = hashTwo(k); //increment using double hash
    } while (j != h);                             // stop if we return to the start
    return -(avail + 1);                          // search has failed
}

private int hashTwo(K key) {
    String keyString = key.toString(); //convert generic -> string -> int
    int keyInt = Integer.parseInt(keyString);
    return 7 - (keyInt % 7);
}

哈希2函数有一些丑陋 - 即从泛型转换为整数,但除此之外,它遵循与本书相同的指令。

1 个答案:

答案 0 :(得分:0)

1.代码中的错误:它必须是&#34; j = hashTwo(j)&#34;

2.公式中的误差:对于k = q 0&gt; h'(k)= q-(k mod q)= q-0 = q = k  (你最好看https://en.wikipedia.org/wiki/Double_hashing获得有效的公式)

  1. 而不是&#34; Integer.parseInt&#34;你应该用

    开始迭代

    private int findSlot(K k,int size){     return findSlot(hashTwo(k.hashCode()),size); }

    private int findSlot(int h,int size){...}