1. 程式人生 > >哈希表-線性探測插入刪除

哈希表-線性探測插入刪除

buffer return 輸入 adl enter 表示法 線性 splay 一個

插入刪除接近常量,大o表示法最快的方式
哈希表查詢也快,但是底層存儲結構是數組,一旦創建無法改變大小
哈希表無法用來有序遍歷
沖突的解決方法:開放地址法(線性探測,二次探測,再哈希)和鏈地址法

//數據項(key值)
public class DataItem {
    private int iData;
    public DataItem(int ii) {
        iData=ii;
    }
    public int getkey() {
        return iData;
    }
    

}
//哈希表
public class HashTable {
    
private DataItem[] hashArray;//數組 private int arraySize;//哈希表的大小 private DataItem nonItem;//標誌刪除之後,該位置存入的數據項 public HashTable(int size) {//初始化 arraySize=size; hashArray=new DataItem[arraySize]; nonItem=new DataItem(-1); } //打印 public void displayTable() { System.out.print(
"table:"); for(int j=0;j<arraySize;j++) if(hashArray[j]!=null) System.out.print(hashArray[j].getkey()+" "); else//如果沒有值,就打印** System.out.print("** "); } //哈希化 public int hashFunc(int key) { return key%arraySize; }
//插入 public void insert(DataItem item) { int key=item.getkey(); int hashVal=hashFunc(key);//哈希化 //線性探測插入 while(hashArray[hashVal]!=null && hashArray[hashVal].getkey()!=-1)//如果不是空的,也不是刪除之後可以插入的 {hashVal++;//當前位置被占,尋找下一個位置 hashVal=hashVal%arraySize;//保證沒有超出索引 } hashArray[hashVal]=item; } //刪除(需要判斷哈希化後的位置有值.並且key是不是那個值) public DataItem delete(int key) { int hashVal=hashFunc(key); while(hashArray[hashVal]!=null) { if(hashArray[hashVal].getkey()==key) { DataItem temp=hashArray[hashVal]; hashArray[hashVal]=nonItem; return temp; } hashVal++; hashVal=hashVal%arraySize; } return null;//沒有找到 } //查找 public DataItem find(int key) { int hashVal=hashFunc(key); while(hashArray[hashVal]!=null) { if(hashArray[hashVal].getkey()==key) { return hashArray[hashVal]; } hashVal++; hashVal=hashVal%arraySize; } return null; } }
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String [] agrs) throws IOException {
        DataItem aDataItem;
        int akey,size,n,keysPerCell;
        System.out.print("Enter:");
        size=getInt();
        System.out.println("初始化:");
        n=getInt();
        keysPerCell=10;
        HashTable theHashTable=new HashTable(size);
        for(int j=0;j<n;j++) {
            akey=(int)(java.lang.Math.random()*keysPerCell*size);
            aDataItem=new DataItem(akey);
            theHashTable.insert(aDataItem);
        }
        while(true) {
            System.out.print("Enter first of show,isnert,delete ,find:");
            char choice=getChar();
            switch(choice){
                case ‘s‘:
                    theHashTable.displayTable();
                    break;
                case ‘i‘:
                    System.out.print("insert:");
                    akey=getInt();
                    aDataItem=new DataItem(akey);
                    theHashTable.insert(aDataItem);
                    break;
                case ‘d‘:
                    System.out.println("輸入要刪除的key");
                    akey=getInt();
                    theHashTable.delete(akey);
                    break;
                case ‘f‘:
                    System.out.println("輸入要查找的key");
                    akey=getInt();
                    aDataItem=theHashTable.find(akey);
                    if(aDataItem!=null)
                        System.out.println("found"+akey);
                    else
                        System.out.println("沒有找到");
                    break;
                    default:
                        System.out.println("無效的輸入");
            }
        }
        
        
        
    }
    public static String getString() throws IOException{
        InputStreamReader isr=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(isr);
        return br.readLine();
    }
    public static char getChar() throws IOException{
        return getString().charAt(0);
    }
    public static int getInt() throws IOException{
        return Integer.parseInt(getString());
    }

}

哈希表-線性探測插入刪除