雜湊表內容的詳細整合

2021-07-31 22:52:25 字數 3537 閱讀 5859

雜湊表內容的詳細整合:

-------------------------------------------

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

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

雜湊表使用

優點:

不論雜湊表中有多少資料,查詢、插入、刪除(有時包括刪除)只需要接近常量的時間即0(1)的時間級。實際上,這只需要幾條機器指令。

雜湊表運算得非常快,在電腦程式中,如果需要在一秒種內查詢上千條記錄通常使用雜湊表(例如拼寫檢查器)雜湊表的速度明顯比樹快,樹的操作通常需要o(n)的時間級。雜湊表不僅速度快,程式設計實現也相對容易。

如果不需要有序遍歷資料,並且可以提前**資料量的大小。那麼雜湊表在速度和易用性方面是無與倫比的。

缺點:缺點它是基與陣列的,陣列建立後難於擴充套件某些雜湊表被基本填滿時,效能下降得非常嚴重

所以程式雖必須要清楚表中將要儲存多少資料(或者準備好定期地把資料轉移到更大的雜湊表中,這是個費時的過程)

而且,也沒有一種簡便的方法可以以任何一種順序〔例如從小到大)遍歷表中的資料項。如果需要這種能力

就只能選擇其他資料結構。

常用雜湊函式實現方法:

1. 直接定址法

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

2. 數字分析法

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

3. 平方取中法

:當無法確定關鍵字中哪幾位分布較均勻時,可以先求出關鍵字的平方值,然後按需要取平方值的中間幾位作為雜湊位址。這是因為:平方後中間幾位和關鍵字中每一位都相關,故不同關鍵字會以較高的概率產生不同的雜湊位址。

例:我們把英文本母在字母表中的位置序號作為該英文本母的內部編碼。例如k的內部編碼為11,e的內部編碼為05,y的內部編碼為25,a的內部編碼為01, b的內部編碼為02。由此組成關鍵字「keya」的內部**為11052501,同理我們可以得到關鍵字「kyab」、「akey」、「bkey」的內部編碼。之後對關鍵字進行平方運算後,取出第7到第9位作為該關鍵字雜湊位址,如下圖所示

關鍵字內部編碼

內部編碼的平方值

h(k)關鍵字的雜湊位址

keya

11050201

122157778355001

778kyab

11250102

126564795010404

795akey

01110525

001233265775625

265bkey

02110525

004454315775625

315

4. 摺疊法

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

5. 隨機數法

6. 除留餘數法

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

衝突處理方法:

1. 開放定址法(closed hashing

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

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

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

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

2. 再雜湊法

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

3. 鏈位址法

(拉鍊法)  (open hashing

4. 建立乙個公共溢位區

查詢效能分析

雜湊表的查詢過程基本上和造表過程相同。一些關鍵碼可通過雜湊函式轉換的位址直接找到,另一些關鍵碼在雜湊函式得到的位址上產生了衝突,需要按處理衝突的方法進行查詢。在介紹的三種處理衝突的方法中,產生衝突後的查詢仍然是給定值與關鍵碼進行比較的過程。所以,對雜湊表查詢效率的量度,依然用平均查詢長度來衡量。

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

1. 雜湊函式是否均勻;

2. 處理衝突的方法;

3. 雜湊表的裝填因子。

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

α是雜湊表裝滿程度的標誌因子。由於表長是定值,α與「填入表中的元素個數」成正比,所以,α越大,填入表中的元素較多,產生衝突的可能性就越大;α越小,填入表中的元素較少,產生衝突的可能性就越小。

實際上,雜湊表

的平均查詢長度是裝填因子α的函式,只是不同處理衝突的方法有不同的函式。

#define hashsize 32

//待存入**資料

char *keywords = ;

char keybuf[hashsize][10];

static char val_flag[hashsize];//標緻已占用儲存單元

void clearflag()

}//雜湊函式,從資料中抽出某個成員用於雜湊值的計算

unsigned int hash(char *s)

if (i

return -1;

}int main(void)

return 0;

詳細講解雜湊表

根據設定的雜湊函式h key 和處理衝突的方法將一組關鍵字對映到乙個有限的連續的位址集 區間 上,並以關鍵字在位址集中的 像 作為記錄在表中的儲存位置,這種表便稱為雜湊表,這一映像過程稱為雜湊造表或雜湊,所得儲存位置稱為雜湊位址或雜湊位址。常用的構造雜湊函式的方法包括 1.直接定址法 取關鍵字或關鍵...

雜湊表(雜湊表)的定義

chapter 雜湊表 雜湊表 1.雜湊表 雜湊表 的定義 2.雜湊表是怎麼進行查詢的?3.雜湊函式設計 直接定址法 4.雜湊函式設計 除留餘數法 5.雜湊衝突處理 開放定址法 6.雜湊衝突處理 鏈位址法 7.雜湊表的鏈位址法實現 8.linux核心中的hash與bucket 9.引入雜湊桶的概念來...

雜湊表(雜湊表)的實現

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