資料結構 hashtable(雜湊表)

2022-09-16 16:33:18 字數 2027 閱讀 2840

雜湊又叫hash。是通過關鍵字把資料對映到指定位置的一種資料結構。理想的雜湊表,是乙個包含關鍵字的固定大小的陣列

雜湊表儲存的是鍵值對,其查詢的時間複雜度與元素數量多少無關,雜湊表在查詢元素時是通過計算雜湊碼值來定位元素的位置從而直接訪問元素的,因此,雜湊表查詢的時間複雜度為o(1)。

hash(key) 通過乙個雜湊的函式,將關鍵字進行計算,將計算的結果存到表裡。如果關鍵字是乙個整數,那麼只要mod表長。如果關鍵字是乙個字串。通常的做法是將字串轉成ascii.然後再通過hash函式計算。 常見的雜湊函式

直接定址法

取關鍵字或者關鍵字的某個線性函式值作為雜湊位址,即h(key)=key或者h(key)=a*key+b(a,b為整數),這種雜湊函式也叫做自身函式.如果h(key)的雜湊位址上已經有值了,那麼就往下乙個位置找,知道找到h(key)的位置沒有值了就把元素放進去.

數字分析法

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

平方取中法

取關鍵字平方後的中間幾位作為雜湊位址.乙個數的平方值的中間幾位和數的每一位都有關。因此,有平方取中法得到的雜湊位址同關鍵字的每一位都有關,是的雜湊位址具有較好的分散性。該方法適用於關鍵字中的每一位取值都不夠分散或者較分散的位數小於雜湊位址所需要的位數的情況。

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

隨機數法

選擇乙個隨機數,去關鍵字的隨機值作為雜湊位址,通常用於關鍵字長度不同的場合.

除留餘數法

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

乙個簡單的hash函式

int hash(char *key,int size)

return temp%size;

}

當使用hash函式計算的時候。可能會出現衝突。即通過hash函式計算得到的結果是一樣的。舉個例子

int hash(int key,int size) 

hash(20,10);

hash(30,10);

會衝突

1.分離鏈結法

解決hash衝突的第一種方法就是分離鏈結法。簡單的說就是拉鍊表。將衝突的元素放到該鍊錶的後面。我們通過查詢的時候,查到在對應的hashtable中。然後再遍歷鍊錶就能找到該元素。

3.開放定址法

如果h(k)被占用,就按照如下序列探測:(h(k)+p(1))%tsize,(h(k)+p(2))%tsize,...,(h(k)+p(i))%tsize,...

其中,h(k)為雜湊函式,tsize為雜湊表的長度,p(i)為探測函式。在(h(k)+p(i))%tsize的基礎上,若發現衝突,則使用

增量p(i+1)進行新的探測,直到無衝突為止。

線性探測法(p(i)=i:1,2,3,4,5,6,....);

二次(或平方)探測法:(p(i)=((-1)(i-1))(i)2:1,-1,4,-4,9,-9,......)

隨機探測法(p(i):為隨機數)

雙雜湊函式(雙雜湊函式h(key)、hp(key),如果h(key)出現衝突,則再使用hp(key)求取雜湊位址)

探測序列為:h(k),h(k)+hp(k), ... ,h(k)+i*hp(k),...

資料結構 Hashtable 閉雜湊

雜湊表是常見資料結構中一種擁有高效插入,高效查詢的結構,時間複雜度為o 1 閉雜湊雜湊的不足之處就是隨著衝突的資料增多,插入的效率也會隨之變慢,為了優化閉雜湊雜湊的效率,我們可以採取以下的方式 1.當插入的資料佔總大小的一定比率的時候,也稱負載因子,我們可以對雜湊表進行擴容,重新通過雜湊函式求得位置...

資料結構 雜湊表(Hash Table)

雜湊表是一種根據關鍵碼去尋找值的資料對映結構,該結構通過把關鍵碼對映的位置去尋找存放值的地方。本質是乙個陣列,陣列中每乙個元素稱為乙個箱子 bin 箱子中存放的是鍵值對。雜湊表的儲存過程如下 根據 key 計算出它的雜湊值 h。假設箱子的個數為 n,那麼這個鍵值對應該放在第 f n 個箱子中。f x...

資料結構 雜湊表(Hash Table)

前言 在實際應用中,很多時候我們map儲存的元素是不需要講究順序,key也不需要具備可比較性的。接下來我們就來了解一下雜湊表 hash table 1.基本概念 這些資料由 key 和 value 組成,雜湊表底層是陣列,key 通過雜湊函式計算 o 1 級別的計算 後,得到陣列的索引,然後在陣列索...