理解雜湊表

2021-07-31 06:31:05 字數 2422 閱讀 7493

雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除(有時包括側除)只需要接近常量的時間即0(1)的時間級。實際上,這只需要幾條機器指令。

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

雜湊表也有一些缺點它是基與陣列的,陣列建立後難於擴充套件某些雜湊表被基本填滿時,效能下降得非常嚴重,所以程式雖必須要清楚表中將要儲存多少資料(或者準備好定期地把資料轉移到更大的雜湊表中,這是個費時的過程)。

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

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

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

1. 直接定址法:取關鍵字或關鍵字的某個線性函式值為雜湊位址。即h(key)=key或h(key) = a•key + b,其中a和b為常數(這種雜湊函式叫做自身函式)

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. di=1,2,3,…, m-1,稱線性探測再雜湊;

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

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

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

3. 鏈位址法(拉鍊法)

當儲存結構是鍊錶時,多採用拉鍊法,用拉鍊法處理衝突的辦法是:把具有相同雜湊位址的關鍵字(同義詞)值放在同乙個單鏈表中,稱為同義詞鍊錶。有m個雜湊位址就有m個鍊錶,同時用指標陣列t[0..m-1]存放各個鍊錶的頭指標,凡是雜湊位址為i的記錄都以結點方式插入到以t[i]為指標的單鏈表中。t中各分量的初值應為空指標。

例如,按上面例9.4所給的關鍵字序列,用拉鍊法構造雜湊表如圖9.14所示。

用拉鍊法處理衝突,雖然比開放定址法多占用一些儲存空間用做鏈結指標,但它可以減少在插入和查詢過程中同關鍵字平均比較次數(平均查詢長度),這是因為,在拉鍊法中待比較的結點都是同義詞結點,而在開放定址法中,待比較的結點不僅包含有同義詞結點,而且包含有非同義詞結點,往往非同義詞結點比同義詞結點還要多。

如前面介紹的例9.4中,用線性探測法構造雜湊表的過程,我們知道,對前5個關鍵字的查詢,每乙個僅需要比較一次,對關鍵字49和24的查詢,則需要比較2次,對關鍵字38的查詢則需要比較4次,而對43的查詢則需要比較3次。因此,對用線性探測法構造的雜湊表的平均查詢長度為:

asl=(1×5+2×2+3×1+4×1)/9 ≈1.78

而用拉鍊法構造的雜湊表上查詢成功的平均查詢長度為:

asl=(1×5+2×3+3×1)/9≈1.55

顯然,開放定址法處理衝突的的平均查詢長度要高於拉鍊法處理衝突的平均查詢長度。但它們都比前面介紹的其它查詢方法的平均查詢長度要短。

#define hashsize 32    

//待存入**資料

char *keywords = ;

char keybuf[hashsize][10];

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

void clearflag()

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

unsigned int hash(char *s)

if (i

雜湊表的理解

因為在開發中經常用到hashmap,hashset等集合結構,但是一直對其中的hash的意思不太理解。今天抽空查了一下資料,順便記錄一下現在的理解。事先宣告一下,此文只介紹雜湊表的資料結構,不介紹具體的hash演算法 首先我們不要去想hash表是用來幹嘛的,先以實際問題著手。就是現在需要乙個能夠儲存...

通俗理解「雜湊表」

今天聊聊 雜湊表 雜湊表 主要作用在於高效查詢。在程式設計實現中,常常面臨著兩個問題 儲存和查詢,儲存和查詢的效率往往決定了整個程式的效率。腦補下,你在家裡忘記了指甲刀放在 通常要在你家所有抽屜中順序尋找,直到找到,最差情況下,有n個抽屜,你就要開啟n個抽屜。這種儲存方式叫陣列,查詢方法稱為 遍歷 ...

雜湊表 粗淺理解

這個人想的以人名為索引建表 人名對映到陣列下標的想法和雜湊表的建立思路如出一轍。雜湊表就是一種為了快速定位查詢而存在的一種資料結構。衝突查詢 當資料多起來的時候,我們幾乎不可能找到乙個實現無衝突的對映函式。假設我們用上面的第二種方法解決衝突,那麼雜湊表中就有乙個這樣的鍊錶 arry 46 小剛 曉光...