雜湊表的構造方法、衝突處理方法及雜湊拉鍊法的簡單程式碼實現
阿新 • • 發佈:2018-12-18
由於雜湊表的查詢高效性,在平時的演算法中用的也是比較多。例如:字串、單詞個數的統計,只出現一次字元或者數字的統計,兩個集合相同元素的查詢等等,還有插入刪除的高效(鏈地址法)都可以用雜湊表來解決。所以這裡對其做一個小小的總結。缺點可能是需要佔用額外的記憶體空間。
一、雜湊函式的構造方法 下面介紹五種常用的雜湊構造方法: 構造雜湊函式的原則是: (1)函式本身便於計算; (2)計算出來的地址分佈均勻,即對任一關鍵字k,f(k) 對應不同地址的概率相等,目的是儘可能減少衝突。1、除留餘數法; 取關鍵字被某個不大於雜湊表長m的數p除後所得的餘數為雜湊地址。即: H(key)=key MODE p,p<=m.(p的取值最好為素數)。 若衝突較多,可取較大的m和p值。2、隨機法;
#include <iostream> using namespace std; #define MODLE 13 struct Haxi_Table { int data;//記錄一共有多少資料 char a; Haxi_Table *next; }; Haxi_Table *haxi_table[MODLE];//雜湊表陣列; void Create_Haxi(int arry[],int num) { for(int i=0;i<num;i++) { int index=arry[i]%MODLE; Haxi_Table *temp=new Haxi_Table; temp->a=i+97; temp->data=num; temp->next=NULL; if(!haxi_table[index]) { haxi_table[index]=temp; } else { temp->next=haxi_table[index]; haxi_table[index]=temp; } } } char FindValue(int value) { int index=value%MODLE; Haxi_Table *p=haxi_table[index]; while(p) { if(p->data=value) { return p->a; } else { p=p->next; } } return -1; } void DestoryHash() { Haxi_Table *temp=NULL; for(int i=0;i<MODLE;i++) { if(haxi_table[i]) { while(haxi_table[i]) { temp=haxi_table[i]; haxi_table[i]=haxi_table[i]->next; delete temp; } } } } int main() { int num; cout<<"please input the number of your data:"<<endl; cin>>num; int *array=new int[num]; cout<<"please input the "<<num<<" data:"<<endl; for(int i=0;i<num;i++) cin>>array[i]; Create_Haxi(array,num); cout<<"查詢結果,8對應的字元為:"<<FindValue(8)<<endl; DestoryHash(); system("pause"); return 0; }