public class HashTable <K, V> implements Table<K, V>{
int idx;
PairHolder table[];
public HashTable(int size){
table=new PairHolder[size];
}
public void put(K key, V value) {
int hVal = key.hashCode();
int hashVal = hashFunc1(hVal);
int stepSize = hashFunc2(hVal);
while(table[index]!=null&&table[index].getFirst() != null){
index += temp;
index %=table.length;
}
table[index].value=value;
}
public int hashFunc1(int key){
int abs = Math.abs(key%table.length);
return abs;
}
public int hashFunc2(int key){
int abs = Math.abs(5-key%5);
return abs;
}
我很难进行双重散列。任何帮助完成此代码以加倍哈希将是伟大的。
答案 0 :(得分:3)
你所做的不是双重哈希。对于双散列,您需要两个单独的散列函数,而不是一个散列函数处理两种方式。在找到空插槽之前,您还没有继续探测;你假设如果第一个位置被占用,第二个位置将为空。您未处理table[col] == null
案例或hashFunc2(key) == 0
案例,或col
超过表格末尾的情况。有关您应该做的事情的详细信息,请参阅Wikipedia。
如果要执行双重散列,则需要两个散列函数。 Java只提供一个,因此可能使用Hasher<K>
方法定义hash(K key)
接口,并在哈希表的构造函数中使用Hasher。然后你的代码看起来像
hash1 = reduce(key.hash());
hash2 = convertToStep(hasher.hash(key));
while (table[hash1] is occupied by a different key) {
hash1 += hash2;
hash1 %= table.length;
}
table[hash1] = key-value pair;
将reduce
散列到表中的索引的函数可以非常简单,但convertToStep
可能更精细。
要查找要使用的其他哈希函数,请查看Google string hash
并查看出现的选项。许多将是相当复杂的,但应该有一些在你可以处理的范围内。您要避免the hash code Java already uses;你想要两个哈希函数,而不是一个有两个名字的函数。
要正确处理空值,最好在创建table
时用PairHolder
填充convertToStep
。您可以在插入项目时填写键和值。
为确保您的步长始终保证找到空插槽,您需要确保{{1}}始终返回步骤的GCD和表长度为1的结果。可能就像总是返回一个奇数并使用2个表大小的幂一样简单。
答案 1 :(得分:0)
This is not Double Hasjinh .Go to This following link You learn Dounle Hashing.
http://www.java2s.com/Code/Java/Collections-Data-Structure/Hashtablewithdoublehashing.htm 了解你的最佳链接
https://courses.cs.washington.edu/courses/cse326/00wi/handouts/lecture16/sld025.htm