雜湊表是常用的資料結構,也是經常的面試題之一,所以程式員應該掌握並在平時的程式中使用它。下面簡單實現一個雜湊表。
比如:數組 a=[3,6,1,5,9,10,100,34],現在要尋找元素100,最笨的演算法就是挨個遍曆,演算法複雜度是O(N),但是要是在平時程式中輕易寫出這樣的代碼,恐怕得被挨批,對於排序,尋找之類的,我們首先應該想到的是hash,因為其複雜度是常數層級的。
first,hash表的構造,我採用除留餘數法。因為我們提前知道數組的大小是8.所以hash表的大小為10.
結果如:
,
hash構造採用除留餘數法,衝突採用線性再探測。如:0%10=0,34%10=4,在4的位置已經有元素,則(34+1)%10=5,5的位置已經有元素5,依此原理6的位置有元素6,直至7的位置沒元素。所以,34 放在此。hash構造的方法和衝突解決的方法原理大概就這樣了。
一般採用hash方法的時候應包括這幾個函數:hash表格的初始化,hash表格的構造,hash表的出入,刪除和查詢。
下面列出代碼:
#include"iostream"using namespace std;#define MAX 10int * InitHash(int length) {int* hashTa=(int *)malloc(length*sizeof(int)); if(!hashTa) return 0; for(int i=0;i<length;++i) hashTa[i]=-1; return hashTa; }void CreateHash(int * HashTa){ int input[8];//=Hash_Ta; cout<<"請輸入預定義的數組:"<<endl; for(int i=0;i<8;++i){ cout<<"請輸入第"<<i<<"個整數"<<endl; cin>>input[i]; } cout<<"原始輸入數組為:"<<endl;for(int i=0;i<8;++i){ cout<<input[i]<<","; }for(int i=0;i<8;++i){int Data0=input[i]%MAX;if(HashTa[Data0]==-1){ HashTa[input[i]%MAX]=input[i];}else{for(int k=1;k<MAX;++k){ int Data1=(Data0+k)%MAX; if(HashTa[Data1]==-1) { HashTa[Data1]=input[i];break; }}}}cout<<"簡曆後的hash表為:"<<endl;for(int i=0;i<MAX;++i){cout<<i<<"-----------"<<HashTa[i]<<endl;}}int SearchHash(int Idata,int * HashTa){ int temp=Idata%MAX; if( HashTa[temp]==-1) return -1;else if(HashTa[temp]==Idata) return temp;else{ for(int i=1;i<MAX;++i) { if(HashTa[(temp+i)%MAX]==-1) return -1; else if(HashTa[(temp+i)%MAX]==Idata) return (temp+i)%MAX; }}return -1;} int main() { int inData; int FlagOfIsConti=1; int*HashTa= InitHash(10); CreateHash(HashTa);cout<<"請輸入要尋找的數:"<<endl; while(FlagOfIsConti){ cout<<"退出程式,輸入0,繼續輸入非0:"; cin>> FlagOfIsConti;cout<<"請輸入要尋找的數:";cin>>inData; cout<< "尋找的結果:"<<SearchHash(inData, HashTa)<<endl;}return 0; }