hash表 hash演算法

2021-09-07 04:11:01 字數 2889 閱讀 6515

概念:

雜湊表(hash table。也叫雜湊表),是依據關鍵碼值(key value)而直接進行訪問的

資料結構。

也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f(key)。對隨意給定的keyword值key。代入函式後若能得到包括該keyword的記錄在表中的位址,則稱表m為雜湊(hash)表。函式f(key)為雜湊(hash) 函式

雜湊函式的選取:

1. 即h(key)=key或h(key) = a·key + b,當中a和b為常數(這樣的雜湊函式叫做自身函式)。

若當中h(key)中已經有值了,就往下乙個找。直到h(key)中沒有值了。就放進去。

2. 數字分析法:分析一組資料。比方一組員工的出生年月日。這時我們發現出生年月日的前幾位數字大體同樣,這種話。出現衝突的機率就會非常大,可是我們發現年月日的後幾位表示月份和詳細日期的數字區別非常大,假設用後面的數字來構成雜湊位址,則衝突的機率會明顯減少。因此數字分析法就是找出數字的規律,盡可能利用這些資料來構造衝突機率較低的雜湊位址。

4. 摺疊法:將keyword切割成位數同樣的幾部分,最後一部分位數能夠不同,然後取這幾部分的疊加和(去除進製)作為雜湊位址。數字疊加能夠有移位疊加和間界疊加兩種方法。移位疊加是將切割後的每一部分的最低位對齊,然後相加。間界疊加是從一端向還有一端沿切割界來回摺疊,然後對齊相加。

5. 隨機數法:選擇一

隨機函式。取keyword的隨機值作為雜湊位址。通經常使用於keyword長度不同的場合。

6. 除留餘數法:取keyword被某個不大於

雜湊表表長m的數p除后所得的餘數為雜湊位址。

即 h(key) = key mod p,p<=m。不僅能夠對keyword直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇非常重要,一般取素數或m,若p選的不好,easy產生同義詞。

處理衝突的方式:

1.開放定址法:出現衝突時採用線性試探、偽隨機試探等方式。

2.公共溢位區法:將衝突元素直接放入公共溢位區(公共溢位區也能夠進行雜湊).

3.拉鍊法(鏈位址法):雜湊表的每乙個元素都是乙個鍊錶。出現衝突時直接掛到相應位置的鍊錶上。

4.在雜湊法:再準備若干雜湊函式。出現衝突時,使用其它雜湊函式進行雜湊。

實現:

線性雜湊表(採用了線性試探解決衝突問題)

/******************************

線性hash表

by rowandjj

2014/7/14

******************************/

#includeusing namespace std;

#define max 20//hash表大小

typedef int datatype;

typedef struct _node_

hashnode,*phashnode;

typedef struct _hashtable_

hashtable,*phashtable;

int hashfunc(datatype key)//hash函式

bool createhashtable(phashtable phashtabletemp);

bool destroyhashtable(phashtable phashtabletemp);

void inserthashtable(phashtable phashtabletemp,datatype data,int (*hashfunc)(datatype));

int stathashtable(hashtable hashtabletemp);//統計空項

void printhashtable(hashtable hashtabletemp);//輸出hash表中的值

int searchkey(hashtable hashtabletemp,datatype data,int (*hashfunc)(datatype));//依據資料查詢其索引

int main()

; cout

cout<

if(!phashtabletemp->phashnodetemp)

else }

return true;

}bool destroyhashtable(phashtable phashtabletemp)

return true;

}void inserthashtable(phashtable phashtabletemp,datatype data,int (*hashfunc)(datatype))

if(stathashtable(*phashtabletemp) == 0)//當hash表滿了的時候。能夠選擇擴容,這裡直接返回

phashtabletemp->phashnodetemp[index].data = data;

phashtabletemp->phashnodetemp[index].flag = 1;

phashtabletemp->cur_elem++;

}int stathashtable(hashtable hashtabletemp)

} return count;

}void printhashtable(hashtable hashtabletemp)

{ int i;

for(i = 0; i < hashtabletemp.n; i++)

{ cout測試:

Hash表和Hash衝突

hash表中的元素儲存位址是通過hash函式計算出來的,當要取出指定元素的時候,直接通過hash函式計算出元素的儲存位址。有時候會出現key不同,但是通過hash函式計算出來的值相同,這個值相同意味著這兩個key要存在同一位置,這顯然不對,這就是hash衝突。hash函式有多種構造方法,常見的有直接...

hash位址 Hash演算法基礎

hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊...

Hash演算法與Hash碰撞

什麼是hash演算法。雜湊函式 英語 hash function 又稱雜湊演算法 雜湊函式,是一種從任何一種資料中建立小的數字 指紋 的方法。雜湊函式把訊息或資料壓縮成摘要,使得資料量變小,將資料的格式固定下來。該函式將資料打亂混合,重新建立乙個叫做雜湊值 hash values,hash code...