我的哈希表代码是否正确?

时间:2018-02-08 16:56:14

标签: java hashtable

我在Java语言中使用线性探测学习使用开放寻址的哈希表。 有人可以检查我的以下代码实现:

public class HashTableOpenAddressing {    
private int table_size = 3;    
private HashTableNode[] hash_table = new HashTableNode[table_size];   
class HashTableNode{
    public int key;
    public int value;        
    HashTableNode(int key, int value){
        this.key = key;
        this.value = value;
    }
}   

HashTableOpenAddressing(){
    for(int i = 0; i < table_size; i++){
        hash_table[i] = null;
    }

}

public void insert(int key, int value){        
    int hash_code = hash_code(key);        
    if(hash_code == 0){
        System.out.println("The hash table is full!!!"); 
        return;
    } 
    hash_table[hash_code] = new HashTableNode(key, value);        
    return;        
}       

public int hash_code(int key) {
    return linear_probing(key);
}


public int linear_probing(int key) {

    for(int i = 0; i< table_size; i++) {
        // if we get next empty slot to insert new node then return the new hash code
        if(hash_table[((key+i) % table_size)] == null) {
            return ((key+i) % table_size);
        }           
    }
    return 0;       
}

public void print_hash_table() {

    for(int i = 0; i < table_size; i++) {
        if(hash_table[i] == null) {
            System.out.println("key: ____"+"  value:____ ");
        }
        else {
            System.out.println("key: "+hash_table[i].key+"  value: "+hash_table[i].value);
        }
    }
    return;
}    
}

这是测试代码:

public class TEST {
    public static void main(String[] args) {        
        HashTableOpenAddressing ht = new HashTableOpenAddressing();
        ht.insert(10, 100);
        ht.insert(10, 1000);
        ht.insert(11, 101);         
        ht.print_hash_table();          
    }
}

在测试代码上,我尝试在哈希表中插入3个key-vlue节点。 如果代码是正确的,那么为什么第3项没有插入哈希表? 请帮我解释一下 感谢

1 个答案:

答案 0 :(得分:1)

问题似乎是您选择使用来自0的{​​{1}}的返回值作为错误指示符,而这可能是有效的哈希码。请记住,数组索引在Java中是从零开始的。

您可以通过将错误代码返回值更改为linear_probing,然后更改-1来检查哈希码是否小于0来解决问题。通过这个简单的更改,您的代码似乎为我工作正常。

insert

我还修改了测试以尝试再添加一个值,但这个值无法正确执行。

public void insert(int key, int value) {
    int hash_code = hash_code(key);
    if (hash_code < 0) {
        System.out.println("The hash table is full!!!");
        return;
    }
    hash_table[hash_code] = new HashTableNode(key, value);
    return;
}

public int linear_probing(int key) {

    for (int i = 0; i < table_size; i++) {
        // if we get next empty slot to insert new node then return the new hash code
        if (hash_table[((key + i) % table_size)] == null) {
            return ((key + i) % table_size);
        }
    }
    return -1;
}

输出:

public static void main(String[] args) {
    HashTableOpenAddressing ht = new HashTableOpenAddressing();
    ht.insert(10, 100);
    ht.insert(10, 1000);
    ht.insert(11, 101);
    ht.insert(11, 1001);
    ht.print_hash_table();
}