資料結構 雜湊表

2021-09-26 04:05:49 字數 3902 閱讀 5349

雜湊(雜湊)技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的關係(雜湊函式),使得每個關鍵字key對應乙個儲存位置,

記錄的儲存位置=f(key)。

雜湊函式是一種對映,設定靈活。

不同關鍵字可能會得到同一雜湊位址即衝突。

雜湊表概念:

根據設定的雜湊函式h(key)和處理衝突的方法將一組關鍵字映像到乙個有限的連續的儲存空間(位址集)上,並以關鍵字在位址集中的「像」作為記錄在表中的儲存位置。

雜湊表的查詢步驟:

當儲存記錄時,通過雜湊函式計算出記錄的雜湊位址

當查詢記錄時,我們通過同樣的是雜湊函式計算記錄的雜湊位址,並按此雜湊位址訪問該記錄

雜湊技術既是儲存方法也是查詢方法,且不需要迭代。

雜湊函式的構造方法

構造雜湊函式的兩個基本原則

1 計算簡單

2 分布均勻

***1.直接定址法

例一:有乙個從1到100歲的人口數字統計表,其中,年齡作為關鍵字,雜湊函式取關鍵字自身。

即:f(key) = key

例二:如果現在要統計的是2023年以後出生的人口數,那麼我們對出生年份這個關鍵字可以變換為:用年份減去1980的值來作為位址。

即:f(key) = key – 1980

實際中使用不多

2 數字分析法

數字分析法通常適合處理關鍵字位數比較大的情況,例如我們現在要儲存某家公司員工登記表,如果用手機號作為關鍵字,那麼我們發現抽取後面的四位數字作為雜湊位址是不錯的選擇。

3 平方取中法

平方取中法是將關鍵字平方之後取中間若干位數字作為雜湊位址。

適合不知關鍵字分布且位數少

4 摺疊法

摺疊法是將關鍵字從左到右分割成位數相等的幾部分,然後將這幾部分疊加求和,並按雜湊表表長取後幾位作為雜湊位址

適合不知關鍵字分布且位數較多

5 除留餘數法

此方法為最常用的構造雜湊函式方法,對於雜湊表長為m的雜湊函式計算公式為:

f(key) = key mod p(p<=m)

事實上,這個方法不僅可以對關鍵字直接取模,也可以通過摺疊、平方取中後再取模。

例如下表,我們對有12個記錄的關鍵字構造雜湊表時,就可以用f(key) = key mod 12的方法。

p的選擇是關鍵,如果對於這個**的關鍵字,p還選擇12的話,那得到的情況未免也太糟糕了:

p的選擇很重要,如果我們把p改為11,那結果就另當別論啦:

由眾人經驗得知:一般情況下,可以選p為質數或不包含小於20的質因數的合數

6 隨機法

選擇乙個隨機數,取關鍵字的隨機函式值為它的雜湊位址。

即:f(key) = random(key)。

這裡的random是隨機函式,當關鍵字的長度不等時,採用這個方法構造雜湊函式是比較合適的

不同情況用不同雜湊函式,考慮因素有:

計算雜湊位址所需的時間

關鍵字的長度

雜湊表的大小

關鍵字的分布情況

記錄查詢的頻率

處理衝突的方法:

1 開放定址法

所謂的開放定址法就是一旦發生了衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能找到,並將記錄存入。

它的公式是:

fi(key) = (f(key)+di) mod m (di=1,2,…,m-1)

例:假設關鍵字集合為,使用除留餘數法(m=12)求雜湊表

插入37時與25衝突則(37+1)mod 12=2,則填入2中

di為增量序列,可有三種取法:

1 線性探測再雜湊

di=1,2,…,m-1

此種易堆積

2 二次探測再雜湊

di=1²,-1²,2²,-2²…,q²,-q²,q<=m/1

此中不易堆積

3 隨機探測再雜湊

di是由乙個隨機函式獲得的數列

2 再雜湊法

fi(key) = rhi(key) (i=1,2,3,…k)

即換函式

3 鏈位址法

例:假設關鍵字集合為,同樣使用除留餘數法求雜湊表。

就像上例中所示有衝突直接在其後再插入乙個形成鍊錶。

4 公共溢位區法

例:假設關鍵字集合為,同樣使用除留餘數法求雜湊表。

建立兩個表,乙個基本表,乙個溢位表,先將資料放入基本表若有衝突則按順序放入溢位表,在查詢時先查詢基本表再查詢溢位表,若都無則查詢失敗。

**

#include #include #define hashsize 12 //表長

#define nullkey -32768 //不會出現的值

typedef struct

hashtable;

//初始化雜湊表

int inithashtable(hashtable *h)

for(int i=0;ielem[i]=nullkey;

}return 0;

} //除留餘數法構造雜湊函式

int hash(int key)

//插入關鍵字到雜湊表

void inserthash(hashtable *h,int key)

h->elem[addr]=key;

}//在雜湊表查詢關鍵字

int searchhash(hashtable *h,int key)

}return addr;

} void print(hashtable *h)

printf("------------------------\n");

}int main()

; inithashtable(&h); //初始化雜湊表

for(i=0;i

print(&h);

//查詢資料

printf("請輸入查詢數字:\n");

scanf("%d",&j);

result=searchhash(&h,j);

if(result!=-1)

else

return 0;

}

資料結構 雜湊表

1.雜湊表的定義 元素的儲存位置和它的關鍵碼之間建立乙個確定的對應關係h,使得每個關鍵碼key和唯一的儲存位置h key 相對應。在查詢時,根據這個確定的對應關係找到給定值k的對映h k 若查詢集合中存在這個記錄,則必定在h k 的位置上,這種查詢技術稱為雜湊技術。採用雜湊技術將記錄儲存在一塊連續的...

資料結構 雜湊表

雜湊表的定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把 關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的 速度。這個對映函式叫做雜湊函式,存放 記錄的陣列叫做雜湊表。雜湊函式的析構方法 餘數法 取關鍵字被某個不大於雜...

資料結構 雜湊表

3 雜湊函式 數字分析法 根據關鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成雜湊位址。適用情況 能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。4 雜湊函式 平方取中法 對關鍵碼平方後,按照雜湊表大小,取中間的若干位作為雜湊位址 平方後擷取 適用情況 實現...