雜湊表的C 實現

2021-07-01 21:06:29 字數 2498 閱讀 1341

雜湊表的幾個概念:

映像:由雜湊函式得到的雜湊表是乙個映像。

衝突:如果兩個關鍵字的雜湊函式值相等,這種現象稱為衝突。

處理衝突的幾個方法:

1、開放位址法:用開放位址處理衝突就是當衝突發生時,形成乙個位址序列,沿著這個序列逐個深測,直到找到乙個「空」的開放位址,將發生衝突的關鍵字值存放到該位址中去。

例如:hash(i)=(hash(key)+d(i)) mod m (i=1,2,3,......,k(k根據增量序列的取法不同,可以得到不同的開放位址處理衝突探測方法。

有線性探測法、二次方探測法、偽隨機探測法。

2、鏈位址法:把所有關鍵字為同義詞的記錄儲存在乙個線性鍊錶中,這個鍊錶成為同義詞鍊錶,即把具有相同雜湊位址的關鍵字值存放在同義鍊錶中。

3、再雜湊表:費時間的一種方法

下面是**:

檔案"myhash.h"

#includeusing namespace std;

typedef int keytype; //設關鍵字域為整形,需要修改型別時,只需修改這裡就可以

const int nullkey=0; //nullkey表示該位置無值

int c=0; //用來統計衝突次數

struct elemtype //資料元素型別

;

int hashsize=; //hash表容量遞增表

int hash_length=0;//hash表表長

class hashtable

,,,,,,,,,,,};  

hashtable h;  

int i,p,j;  

keytype k;  

h.init_hashtable();  

for(i=0;i<11;i++) //插入前11個記錄

cout<<"按雜湊位址順序遍歷雜湊表"

cout<

cout<<"輸入要查詢的記錄的關鍵字:";  

cin>>k;  

j=h.search_hash(k,p);  

if(j==1)  

h.get_data(p);  

else

cout<<"無此記錄"

<

j=h.insert_hash(r[11]); //插入最後乙個元素

if(j==0)  

cout<<"遍歷重建後的雜湊表"

cout<

cout<<"輸入要查詢的記錄的關鍵字:";  

cin>>k;  

j=h.search_hash(k,p);  

if(j==1)  

h.get_data(p);  

else

cout<<"該記錄不存在"

<

cout<<"____銷毀雜湊表____"

return 0;  

}  

測試結果:

cpp** 

按雜湊位址順序遍歷雜湊表  

雜湊位址0->10  

元素的關鍵字值和它的標誌分別是:5  9  

元素的關鍵字值和它的標誌分別是:1  5  

元素的關鍵字值和它的標誌分別是:2  6  

元素的關鍵字值和它的標誌分別是:3  7  

元素的關鍵字值和它的標誌分別是:4  8  

元素的關鍵字值和它的標誌分別是:60  2  

元素的關鍵字值和它的標誌分別是:17  1  

元素的關鍵字值和它的標誌分別是:29  3  

元素的關鍵字值和它的標誌分別是:38  4  

元素的關鍵字值和它的標誌分別是:6  10  

元素的關鍵字值和它的標誌分別是:7  11  

輸入要查詢的記錄的關鍵字:5  

元素的關鍵字值和它的標誌分別是:5  9  

____重建hash表_____  

插入失敗  

需要重建雜湊表才可以插入  

____重建雜湊表____  

遍歷重建後的雜湊表  

雜湊位址0->18  

元素的關鍵字值和它的標誌分別是:38  4  

元素的關鍵字值和它的標誌分別是:1  5  

元素的關鍵字值和它的標誌分別是:2  6  

元素的關鍵字值和它的標誌分別是:3  7  

元素的關鍵字值和它的標誌分別是:4  8  

元素的關鍵字值和它的標誌分別是:5  9  

元素的關鍵字值和它的標誌分別是:60  2  

元素的關鍵字值和它的標誌分別是:6  10  

元素的關鍵字值和它的標誌分別是:7  11  

元素的關鍵字值和它的標誌分別是:8  12  

元素的關鍵字值和它的標誌分別是:29  3  

元素的關鍵字值和它的標誌分別是:17  1  

輸入要查詢的記錄的關鍵字:7  

元素的關鍵字值和它的標誌分別是:7  11  

____銷毀雜湊表____  

press any key to continue

雜湊表(雜湊表) C 實現

雜湊函式就是 關鍵字key 到 值value 的對映 value f key value反映的是關鍵字key的儲存位址。直接定址法 f key a key b 例如存放不同出生年份的人口數量,出生年份是關鍵字,那麼可以用直接定址法。直接定址法的優點是簡單均勻,也不會產生衝突 缺點是該方法適合表比較小...

雜湊表(雜湊表)的實現

雜湊函式直接用key size的形式,size為雜湊表的大小。衝突處理採用平方探測法,為保證可以探測到整個雜湊表空間,雜湊表大小設定為4k 3形式的素數。當雜湊表中的元素過多時會造成效能下降,這時應該倍增雜湊表的大小,重新計算原來雜湊表中每個元素在新的雜湊表中的位置。雜湊表的實現 hashtable...

雜湊表 雜湊表 C語言簡單實現

本文參考自 大話資料結構 通過某個函式f計算出記錄的儲存位置,而不需要通過比較,這就是一種新的儲存技術 雜湊技術。雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 在查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查...