如何使我的线性探针哈希函数更有效?

时间:2018-12-15 23:25:59

标签: java algorithm hash

我在这里努力查看我的线性探测技术是否正确以及它是否有效。我有什么办法可以提高效率?

static void enterValues(int values[], int hashTable[])
{
    for(int i = 0; i < values.length; i++){
        int k = hashFunction(values[i]);
        if(hashTable[k]== 0)
        hashTable[k] = values[i];
        else{
            boolean b = false;
            int counter = k%hashTable.length+1;
            if(counter >= hashTable.length)
                counter = 0;
                while (!b) {
                    if (hashTable[counter] == 0) {
                        hashTable[counter] = values[i];
                        b = true;
                    } else {
                        counter = counter % hashTable.length+1;
                    }
                }
            }
        }
    }

static int hashFunction(int value)
{
    return value % 10;
}

int values[] = {4371,1323,6173,4199,4344,9679,1989};

大小为10的哈希集的输出为

9679,
4371,
1989,
1323,
6173,
4344,
0,
0,
0,
4199

谢谢您的光临

2 个答案:

答案 0 :(得分:0)

为什么您的哈希函数仅返回value % 10?最好返回value % hashTable.length。我建议您使用Integer.hashCode,然后使用hashTable.length

进行模量计算
int counter = k%hashTable.length+1;
if(counter >= hashTable.length)
    counter = 0;

这两个语句可以替换为:int counter = k % hashTable.length

为提高效率,您可以额外进行簿记,将未填充的索引存储在哈希表中,并在填充时查询此未填充的数组(或更好的数据结构-可以通过排序树进行搜索,如果发生冲突,则可以更快地插入和删除。

答案 1 :(得分:0)

不正确。考虑如果value[i]为零会发生什么:

   if (hashTable[k] == 0) {
        hashTable[k] = values[i];
   } else { .... }

由于您在哈希表中使用零表示未使用该条目,并且还直接在表中分配了值,因此您的代码无法将零值与空条目区分开。