我在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项没有插入哈希表? 请帮我解释一下 感谢
答案 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();
}