hash表詳細講解及實現

2021-06-16 18:11:07 字數 3019 閱讀 7388

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

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

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

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

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

雜湊表演算法-雜湊表的概念及作用

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

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

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

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

雜湊表演算法

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

雜湊表演算法

上面這張表即雜湊表。

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

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

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

這個問題是雜湊表不可避免的,即衝突現象:對不同的關鍵字可能得到同一雜湊位址。

雜湊表演算法-雜湊表的構造方法

1、直接定址法

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

但這種方法效率不高,時間複雜度是o(1),空間複雜度是o(n),n是關鍵字的個數

雜湊表演算法

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,則:

雜湊表演算法

5、除留餘數法

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

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

6、隨機數法

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

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

雜湊表演算法-處理衝突的方法

如果兩個同學分別叫 劉麗 劉蘭,當加入劉蘭時,位址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取值可能為偽隨機數列。稱偽隨機探測再雜湊。

例:在長度為11的雜湊表中已填有關鍵字分別為17,60,29的記錄,現有第四個記錄,其關鍵字為38,由雜湊函式得到位址為5,若用線性探測再雜湊,如下:

雜湊表演算法

2、再雜湊法

當發生衝突時,使用第二個、第三個、雜湊函式計算位址,直到無衝突時。缺點:計算時間增加。

3、鏈位址法

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

雜湊表演算法

4、建立乙個公共溢位區

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

/*hash表,採用陣列實現,2012.9.28*/ 

#include#define datatype int

#define m 30

typedef struct hashnode

hashtable;

hashtable hashtable[m];

void inithashtable() //對hash表進行初始化

{ int i;

for(i = 0; i

堆排序的詳細講解及實現

堆排序 特點 堆排序 heapsort 是一樹形選擇排序。堆排序的特點是 在排序過程中,將r l.n 看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係 參見二叉樹的順序儲存結構 在當前無序區中選擇關鍵字最大 或最小 的記錄 堆排序與直接選擇排序的區別直接選擇排序中...

詳細講解雜湊表

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

Scope註解 詳細講解及示例

4.惡漢 懶漢 5.bean例項物件的銷毀 6.scope註解的使用場景 scope註解是 spring ioc 容器中的乙個作用域,在 spring ioc 容器中,他用來配置bean例項的作用域物件。scope 具有以下幾種作用域 singleton 單例項的 單例 預設 全域性有且僅有乙個例項...