二次探测哈希表

时间:2015-12-06 01:06:00

标签: java hashtable quadratic-probing

Hellow,由于某些原因我插入时无法获取哈希表以填充项目和键。它似乎是在通过驱动程序运行时添加的,但没有存储任何内容,并且绝对没有错误消息。 我想创建一个利用二次探测的哈希表。我想要计算不能超过的横向数量。 20。

以下是代码:

public class HashTable {
    String[] table;
    String[] keys;
    int currentSize, maxSize, numOfEntries;
    int traverse = 0;
    double capacity;    

public HashTable(int size, double load){
    if(size <= 0){
        System.out.println("Size must be greater then 0");
    }
    else if(load < 0 || load > 1){
        System.out.println("Load must be between 0 and 1. EX: 0.75");
    }else{
        this.currentSize = 0;
        table = new String[size];
        keys = new String[size];
        this.capacity = load * size;
        this.maxSize = size;
    }
}

public int hash(String num){
    return (2 * Integer.parseInt(num) + 5) % table.length;
}

public int getLength(){
    return table.length;
}

public int getMaxSize(){
    return maxSize;
}

public int probe(String num){
    int temp = hash(num);
    int calc = 0;
    numOfEntries = 0;

        while(table[temp] != null){
            traverse++;
            temp = (int)((temp + (float)calc/2 + (float) (calc * calc)) % maxSize);
            calc++;
            numOfEntries++;
        }

    if(traverse >= 20){
        System.out.println("Insert Failed : Reached 20 Traversal Limit!");
        return 20;
    }

    return temp;
}

public void resize(){
    String [] tempTable = table;
    if(table.length >= capacity){
        table = new String[tempTable.length * 2];
        for(int i = 0; i < tempTable.length; i++){
            if(tempTable[i] != null){
                insert(tempTable[i]);
            }
        }
    }
}

public void insert(String num){
    int temp = probe(num);
    table[temp] = num;
    currentSize++;

    if(currentSize >= capacity){
        resize();
    }

}


public String searchKey(String key){
    String temp = "";
    numOfEntries = 0;
    for(int i = 0; i < keys.length; i++){
        if(key == keys[i]){
            temp = table[i];
            numOfEntries++;
            break;
        }
        numOfEntries++;

    }

    if(temp == ""){
        System.out.println("No items that match that key!");
    }
    return temp;
}

public int numOfEntries(){
    return numOfEntries;
}

public void print(){
System.out.println("Key\t:\tValue");
for(int i = 0; i < table.length; i++){
    if(keys[i] != null){
        System.out.println(keys[i] + "\t:\t" + table[i]);
    }
}
    System.out.println();
}

}

这是驱动程序:

import java.util.*;
public class HashTableDriver {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter Table Size:\t");
    int size = scan.nextInt();
    System.out.println("Enter Load Factor (Between 0 and 1");
    double load = scan.nextDouble();



    int temp = 0;
    HashTable table = new HashTable(size,load);
    System.out.println(table.getLength());
    System.out.println(table.getMaxSize());


    while(temp != 4){
        System.out.println();
        System.out.println("i)(1) Insert an item to the Hash Table" +
                "\nii)(2) Search A Specific Key" +
                "\niii)(3) Display the Table" +
                "\nvii)(4) Quit");
        String input = scan.next();

        switch(input){
        case "1":
            System.out.println();
            System.out.println("Enter value to add to table");
            String desKey1 = scan.next();
            table.insert(desKey1);
            continue;
        case "2":
            System.out.println("Please enter specific key desired:\t");
            String desKey2 = scan.next();
            if(table.searchKey(desKey2).equals(desKey2)){
                System.out.println("Key Found");
                System.out.println("Number of cells accessed:\t" + table.numOfEntries());
            }
            else{
                System.out.println("Key Not Found");
            }
            continue;
        case "3":
            table.print();
            continue;
        case "4":
            temp = 4;
            break;
        }
    }
}

}

0 个答案:

没有答案