Hash 表詳解(雜湊表)

2022-05-06 08:03:11 字數 2500 閱讀 4636

雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。

給定表m,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的位址,則稱表m為雜湊(hash)表,函式f(key)為雜湊(hash) 函式。

雜湊函式能使對乙個資料序列的訪問過程更加迅速有效,通過雜湊函式,資料元素將被更快地定位。

實際工作中需視不同的情況採用不同的雜湊函式,通常考慮的因素有:

· 計算雜湊函式所需時間

· 關鍵字的長度

· 雜湊表的大小

· 關鍵字的分布情況

· 記錄的查詢頻率

構造方法:

1.直接定址法:取關鍵字或關鍵字的某個線性函式值為雜湊位址。即h(key)=key或h(key) = a·key + b,其中a和b為常數(這種雜湊函式叫做自身函式)。若其中h(key)中已經有值了,就往下乙個找,直到h(key)中沒有值了,就放進去。

2.數字分析法:分析一組資料,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現衝突的機率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果用後面的數字來構成雜湊位址,則衝突的機率會明顯降低。因此數字分析法就是找出數字的規律,盡可能利用這些資料來構造衝突機率較低的雜湊位址。

3.平方取中法:取關鍵字平方後的中間幾位作為雜湊位址。

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

5.隨機數法:選擇一隨機函式,取關鍵字的隨機值作為雜湊位址,通常用於關鍵字長度不同的場合。

6.除留餘數法:取關鍵字被某個不大於雜湊表表長m的數p除后所得的餘數為雜湊位址。即 h(key) = key mod p,p<=m。不僅可以對關鍵字直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇很重要,一般取素數或m,若p選的不好,容易產生同義詞。

處理衝突

1.開放定址法:hi=(h(key) + di) mod m,i=1,2,…,k(k<=m-1),其中h(key)為雜湊函式,m為雜湊表長,di為增量序列,可有下列三種取法:

1.1. di=1,2,3,…,m-1,稱線性探測再雜湊;

1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)稱二次探測再雜湊;

1.3. di=偽隨機數序列,稱偽隨機探測再雜湊。

2.再雜湊法:hi=rhi(key),i=1,2,…,k rhi均是不同的雜湊函式,即在同義詞產生位址衝突時計算另乙個雜湊函式位址,直到衝突不再發生,這種方法不易產生「聚集」,但增加了計算時間。

3.鏈位址法(拉鍊法)

4.建立乙個公共溢位區

查詢過程中,關鍵碼的比較次數,取決於產生衝突的多少,產生的衝突少,查詢效率就高,產生的衝突多,查詢效率就低。因此,影響產生衝突多少的因素,也就是影響查詢效率的因素。影響產生衝突多少有以下三個因素:

1. 雜湊函式是否均勻;

2. 處理衝突的方法;

3. 雜湊表的裝填因子。

雜湊表的裝填因子定義為:α= 填入表中的元素個數 / 雜湊表的長度

對於查詢時成功與不成功的**平均**長度請看例項圖:

普通**:

#include#include#define hashsize 6

#define nk -1

typedef structht;

int m=0;

bool init(ht *h)

int hash(int key)

void insert(ht *h,int key)

bool search(ht *h,int key)

} return true;

}int main()

{ int n,key;

ht h;

if(init(&h))

printf("初始化完成!!!\n");

else

printf("初始化失敗!!!\n");

scanf("%d",&n);//要存入hash表的數字量

for(int i=0;i

hash表(雜湊表)詳解

什麼是雜湊表?雜湊表 hash table,也叫雜湊表 是 根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做 雜湊函式 存放記錄的陣列叫做 雜湊表。記錄的儲存位置 f 關鍵字 這裡的對應關係f稱為雜...

Hash表(雜湊表 雜湊表)

雜湊函式 乙個把查詢表中的關鍵字對映成該關鍵字對應的位址的函式,記為hash key addr。位址可以是陣列下標,索引,或記憶體位址等 衝突 雜湊函式可能會把兩個和兩個以上的不同關鍵字對映到同一位址。衝突不可避免,所以要設計好的處理衝突的方法。同義詞 發生碰撞的不同關鍵字為同義詞。雜湊表 根據關鍵...

雜湊(hash 雜湊表)

可以認為雜湊有著陣列的思想,它將所有的資料段拼成乙個陣列 順序表 進行儲存,通過雜湊函式,可以基本上以o 1 的時間複雜度來查詢和儲存資料。通過資料段中的唯一關鍵字 key 經過某種演算法,得出此資料段在整個雜湊陣列 順序表 中的的下標,然後直接取元素即可。有資料結構如下 資料段 key,value...