資料結構教程 雜湊表

2021-05-11 01:36:15 字數 4222 閱讀 4266

一、雜湊表的概念及作用

一般的線性表,樹中,記錄在結構中的相對位置是隨機的,即和記錄的關鍵字之間不存在確定的關係,因此,在結構中查詢記錄時需進行一系列和關鍵字的比較。這一類查詢方法建立在「比較「的基礎上,查詢的效率依賴於查詢過程中所進行的比較次數。

理想的情況是能直接找到需要的記錄,因此必須在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使每個關鍵字和結構中乙個唯一的儲存位置相對應。

雜湊表最常見的例子是以學生學號為關鍵字的成績表,1號學生的記錄位置在第一條,10號學生的記錄位置在第10條...

如果我們以學生姓名為關鍵字,如何建立查詢表,使得根據姓名可以直接找到相應記錄呢?ab

cdef

ghij

klmn

opqr

stuv

wxyz

1234

5678

9101112

1314

1516

1718

1920

2122

2324

2526

劉麗劉巨集英

吳軍吳小豔

李秋梅陳偉

...姓名中各字拼音首字母

lllhy

wjwxy

lqmcw

...用所有首字母編號值相加求和

2446

3372

4226

...最小值可能為3 最大值可能為78 可放75個學生

用上述得到的數值作為對應記錄在表中的位置,得到下表:

成績一成績二...

3...

......

24劉麗

8295

25...

26陳偉

......

33吳軍

......

42李秋梅

......

46劉巨集英

......

72吳小豔

......

78...

上面這張表即雜湊表。

如果將來要查李秋梅的成績,可以用上述方法求出該記錄所在位置:

李秋梅:lqm 12+17+13=42 取表中第42條記錄即可。

問題:如果兩個同學分別叫 劉麗 劉蘭 該如何處理這兩條記錄?

二、雜湊表的構造方法

1、直接定址法

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

位址01

02...

2526

27...

100年齡12

...25

2627

......

人數3000

2000

...1050

......

......

...

2、數字分析法

有學生的生日資料如下:

年.月.日

75.10.03

75.11.23

76.03.02

76.07.12

75.04.21

76.02.15

...經分析,第一位,第二位,第三位重複的可能性大,取這三位造成衝突的機會增加,所以盡量不取前三位,取後三位比較好。

3、平方取中法

取關鍵字平方後的中間幾位為雜湊位址。

4、摺疊法

將關鍵字分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分的疊加和(捨去進製)作為雜湊位址,這方法稱為摺疊法。

例如:每一種西文圖書都有乙個國際標準圖書編號,它是乙個10位的十進位制數字,若要以它作關鍵字建立乙個雜湊表,當館藏書種類不到10,000時,可採用此法構造乙個四位數的雜湊函式。如果一本書的編號為0-442-20586-4,則:

5864

5864

4220

0224

+)04

+)04

-----------

-----------

10088

6092

h(key)=0088

h(key)=6092

(a)移位疊加

(b)間界疊加

5、除留餘數法

取關鍵字被某個不大於雜湊表表長m的數p除后所得餘數為雜湊位址。

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

6、隨機數法

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

h(key)=random(key) ,其中random為隨機函式。通常用於關鍵字長度不等時採用此法。

二、處理衝突的方法

成績一成績二...

3...

......

24劉麗

8295

25...

26陳偉

......

33吳軍

......

42李秋梅

......

46劉巨集英

......

72吳小豔

......

78...

如果兩個同學分別叫 劉麗 劉蘭,當加入劉蘭時,位址24發生了衝突,我們可以以某種規律使用其它的儲存位置,如果選擇的乙個其它位置仍有衝突,則再選下乙個,直到找到沒有衝突的位置。選擇其它位置的方法有:

1、開放定址法

hi=(h(key)+di) mod m i=1,2,...,k(k<=m-1)

其中m為表長,di為增量序列

如果di值可能為1,2,3,...m-1,稱線性探測再雜湊。

如果di取值可能為1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)

稱二次探測再雜湊。

如果di取值可能為偽隨機數列。稱偽隨機探測再雜湊。01

2345

6789

1060

1729

(a)插入前01

2345

6789

1060

172938

(b)線性探測再雜湊01

2345

6789

1060

1729

(c)二次探測再雜湊01

2345

6789

1038

601729

(d)偽隨機探測再雜湊

偽隨機數列為9,5,3,8,1...

2、再雜湊法

3、鏈位址法

將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。

4、建立乙個公共溢位區

假設雜湊函式的值域為[0,m-1],則設向量hashtable[0..m-1]為基本表,另外設立儲存空間向量overtable[0..v]用以儲存發生衝突的記錄。

三、雜湊表的查詢

//開放定址雜湊表的儲存結構

int hashsize=;

typedef structhashtable;

#define success 1

#define unsuccess 0

#define duplicate -1

status searchhash(hashtable h,keytype k,int &p,int &c){

p=hash(k);

while(h.elem[p].key!=nullkey && !eq(k,h.elem[p].key))

collision(p,++c);

if(eq(k,h.elem[p].key)

return success;

else return unsuccess;

status inserthash(hashtable &h,eletype e){

c=0;

if(searchhash(h,e.key,p,c))

return duplicate;

else if(ch.elem[p]=e; ++h.count; return ok;

else recreatehashtable(h);

資料結構 雜湊表

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

資料結構 雜湊表

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

資料結構 雜湊表

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