二次探測:每次加的步長隨機或者是必定規律的數值
再哈希法:哈希化有兩個,第二個哈希化不能輸出0,不能與第一個哈希化相同
第二個哈希化獲得的結果是當前衝突時,索引須要加的值,便是在二次探測的基礎上將步長的改進java
//數據項(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;//標誌刪除以後,該位置存入的數據項(-1) 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("** "); System.out.println(); } //哈希化 public int hashFunc(int key) { return key%arraySize; } //第二次哈希化 public int hashFunc2(int key) { //constant-(key%constant) constant爲質數 return 5-key%5; //key%5 會小於5,那麼5-key%5確定大於0 } //插入 public void insert(int key,DataItem item) { int hashVal=hashFunc(key);//第一次哈希化 int stepSize=hashFunc2(key);//再哈希獲得步長 //再哈希法插入 while(hashArray[hashVal]!=null && hashArray[hashVal].getkey()!=-1)//若是不是空的,也不是刪除以後能夠插入的 {hashVal+=stepSize;//當前位置被佔,尋找下一個位置(再哈希法) hashVal=hashVal%arraySize;//保證沒有超出索引 } hashArray[hashVal]=item; } //刪除(須要判斷哈希化後的位置有值.而且key是否是那個值) public DataItem delete(int key) { int hashVal=hashFunc(key);//哈希化 int stepSize=hashFunc2(key);//第二次哈希化 while(hashArray[hashVal]!=null) {//不等於空 if(hashArray[hashVal].getkey()==key) {//數據項相同 DataItem temp=hashArray[hashVal];//要刪除的數據項 hashArray[hashVal]=nonItem; return temp; } hashVal+=stepSize;//數據項不一樣 hashVal=hashVal%arraySize; } return null;//沒有找到,第一次就是空的,或者再哈希法也沒有找到 } //查找 public DataItem find(int key) { int hashVal=hashFunc(key); int stepSize=hashFunc2(key);//第二次哈希化 while(hashArray[hashVal]!=null) { if(hashArray[hashVal].getkey()==key) { return hashArray[hashVal]; } hashVal+=stepSize; 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; System.out.print("Enter:"); size=getInt(); System.out.println("初始化:"); n=getInt(); HashTable theHashTable=new HashTable(size); for(int j=0;j<n;j++) { akey=(int)(java.lang.Math.random()*2*size); aDataItem=new DataItem(akey); theHashTable.insert(akey,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(akey,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()); } }