0
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;
}

我很难使用双重哈希。完成此代码以加倍哈希的任何帮助都会很棒。

4

2 回答 2

4

你正在做的不是双重哈希。对于双重哈希,您需要两个单独的哈希函数,而不是一个哈希函数以两种方式处理。在找到空槽之前,您也不会继续探测;如果第一个被占用,您只是假设第二个位置将是空的。你没有处理这个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可能更微妙。

要找到另一个要使用的哈希函数,谷歌string hash并查看出现的选项。许多会相当复杂,但应该有一些在您可以处理的范围内。您需要避免Java 已经使用的哈希码;你想要两个散列函数,而不是一个有两个名字的函数。

为了正确处理空值,最好在创建时tablePairHolders 填充它。您可以在插入项目时填写键和值。

为了确保您的步长始终保证找到一个空槽,您需要确保convertToStep始终返回步长的 GCD 和表长度为 1 的结果。这可能就像总是返回奇数一样简单并使用 2 个表格大小的力量。

于 2014-02-23T03:41:07.493 回答
-1
    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 bestlink to Undestand you

https://courses.cs.washington.edu/courses/cse326/00wi/handouts/lecture16/sld025.htm

于 2014-02-23T03:56:00.547 回答