我在这里努力查看我的线性探测技术是否正确以及它是否有效。我有什么办法可以提高效率?
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
谢谢您的光临
答案 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 { .... }
由于您在哈希表中使用零表示未使用该条目,并且还直接在表中分配了值,因此您的代码无法将零值与空条目区分开。