java 陣列實現雜湊表的構建,查詢,插入,刪除
阿新 • • 發佈:2019-01-07
以下程式碼以陣列儲存方式實現了雜湊表的建立,查詢,插入,刪除等操作,雜湊函式採用除留餘數法,使用開放定址法中的線性探查法處理衝突
public class HashSearch {
/*使用陣列實現hashtable的建立,查詢,插入,刪除*/
class Node{ //結點內部類表示hashtable中儲存的元素
int key; //資料域
boolean delflag; //在刪除時使用,作為刪除標誌
int times; //比較次數
public Node(int data){
key=data;
delflag=false ;
times=0;
}
}
public int Collision(int d,int hashsize){
/*線性探查法處理衝突,hashsize表示HashTable的大小*/
return (d+1)%hashsize;
}
public int HashFunc(int key,int hashsize){
/*採用除留餘數法構造雜湊函式*/
return key%hashsize;
}
/*hashtable的查詢*/
public int Hashsearch(Node[]HashTable,int x){
/*HashTable為雜湊表陣列,x為待查詢的元素*/
/*找到,則返回雜湊地址;沒找到返回負的雜湊地址*/
int addr;
int hashsize=HashTable.length;
addr=HashFunc(x,hashsize); //獲得雜湊地址
while(HashTable[addr]!=null && HashTable[addr].key!=x){
addr=Collision(addr,hashsize); //沒找到,處理衝突
}
if(HashTable[addr]!=null && HashTable[addr].key==x) //查詢成功
return addr;
else return -addr; //查詢失敗
}
/*雜湊表的插入*/
public int HashInsert(Node[]HashTable,int x){
int addr;
addr=Hashsearch(HashTable,x); //在雜湊表中查詢
if(addr>0) return 0; //找到則不必插入
HashTable[-addr]=new Node(x); //沒找到,則插入
HashTable[-addr].times=1; //設定比較次數
return 1; //插入成功
}
/*雜湊表的建立*/
public void CreateHash(Node[]HashTable,int items[]){
/*利用所給關鍵字的序列items,建立雜湊表,n為關鍵字的個數*/
int hashsize=HashTable.length;
int n=items.length;
int i;
for(i=0;i<hashsize;i++){ //初始化雜湊表
HashTable[i]=null;
}
for(i=0;i<n;i++){
HashInsert(HashTable,items[i]); //依次向雜湊表中插入元素
}
}
/*雜湊表的刪除*/
public int HashDelete(Node[]HashTable,int x){
int addr;
addr=Hashsearch(HashTable, x); //查詢資料元素
if(addr>0){
HashTable[addr].delflag=true; //找到,則設定刪除標記為true
return 1;
}
return 0;
}
/*雜湊表的顯示*/
public void Displayhash(Node[]HashTable){
int i,hashsize=HashTable.length;
System.out.print("雜湊表\n雜湊地址:");
for(i=0;i<hashsize;i++){
System.out.print(i+" ");
}
System.out.print("\n關鍵字: ");
for(i=0;i<hashsize;i++){
if(HashTable[i]!=null && HashTable[i].delflag==false){
if(HashTable[i].key<10)
System.out.print(HashTable[i].key+" ");
else System.out.print(HashTable[i].key+" ");
}
else System.out.print(","+" ");
}
}
public static void main(String[] args) {
int []items=new int[]{15,59,22,34,7,78};
Node[] HashTable=new Node[7];
HashSearch hs=new HashSearch();
hs.CreateHash(HashTable, items);
hs.Displayhash(HashTable);
int addr;
addr=hs.Hashsearch(HashTable, 59);
System.out.println("\n"+addr);
hs.HashDelete(HashTable, 34);
hs.Displayhash(HashTable);
}
}