資料結構之hash

2021-07-29 15:47:18 字數 2396 閱讀 7954

#1.hash表

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

以資料中每個元素的關鍵字k為自變數,通過雜湊函式h(k)計算出函式值,以該函式值作為一塊連續儲存空間的的單元位址,將該元素儲存到函式值對應的單元中。

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

#2.雜湊表的構造方法

##2.1直接定址法

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

##2.2 數字分析法

分析一組資料,比如一組員工的出生年月,這時我們發現出生年月的前幾位數字一般都相同,因此,出現衝突的概率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果利用後面的幾位數字來構造雜湊位址,則衝突的機率則會明顯降低.   因此數字分析法就是找出數字的規律,盡可能利用這些資料來構造衝突機率較低的雜湊位址.     此法適於:能預先估計出全體關鍵字的每一位上各種數字出現的頻度。 ##2.3 平方取中法 

以關鍵字的平方值的中間幾位作為儲存位址(雜湊位址)。求「關鍵字的平方值」 的目的是「擴大差別」 ,同時平方值的中間各位又能受到整個關鍵字中各位的影響。 

此法適於:關鍵字中的每一位都有某些數字重複出現頻度很高的現象。 ##2.4 摺疊法 

將關鍵字分割成若干部分,然後取它們的疊加和為雜湊位址。兩種疊加處理的方法:移位疊加:將分 割後的幾部分低位對齊相加;間界疊加:從一端沿分割界來回摺疊,然後對齊相加。      此法適於:關鍵字的數字位數特別多。 

##2.5隨機數法

設定雜湊函式為:h(key) = random(key)其中,random 為偽隨機函式 此法適於:對長度不等的關鍵字構造雜湊函式。

##2.6除留餘數法

取關鍵字被某個不大於雜湊表表長m的數p除后所得的餘數為雜湊位址.即   雜湊函式為:h(key) = key mod p ( p≤m ),其中, m為表長,p 為不大於 m 的素數。

#3.雜湊表衝突解決方法

雜湊表處理衝突主要有開放定址法、再雜湊法、鏈位址法(拉鍊法)和建立乙個公共溢位區四種方法。   通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另乙個關鍵問題。  「處理衝突」 的實際含義是:為產生衝突的關鍵字尋找下乙個雜湊位址。 ##3.1開放定址法      一旦發生了衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能找到,並將記錄存入。

###3.1.1線性探測

衝突發生時,順序檢視表中下一單元,直到找出乙個空單元或查遍全表。

公式:   

fi(key) = (f(key)+di) mod m (di=1,2,3,......,m-1)
###3.1.2二次探測法

衝突發生時,在表的左右進行跳躍式探測,雙向尋找到可能的空位置。

公式:

fi(key) = (f(key)+di) mod m (di = 12, -12, 22, -22,……, q2, -q2, q <= m/2)
###3.1.3隨機探測法

在衝突時,對於位移量 di 採用隨機函式計算得到,我們稱之為隨機探測法。

公式:  

fi(key) = (f(key)+di) mod m (di是乙個隨機數列)
線性探測再雜湊容易產生「二次聚集」,即在處理同義詞的衝突時又導致非同義詞的衝突。   線性探測再雜湊的優點是:只要雜湊表不滿,就一定能找到乙個不衝突的雜湊位址,而二次探測再雜湊和偽隨機探測再雜湊則不一定。

##3.2鏈位址法

將所有雜湊位址相同的記錄都鏈結在同一鍊錶中。各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況。    處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;

##3.3再雜湊法

這種方法是同時構造多個不同的雜湊函式:

hi=rh1(key),i=1,2,3,…,n.
當雜湊位址hi=rh1(key)發生衝突時,再計算hi=rh2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。

##3.4建立公共溢位區

這種方法的基本思想是:將雜湊表分為基本表和溢位錶兩部分,凡是和基本表發生衝突的元素,一律填入溢位表.(注意:在這個方法裡面是把元素分開兩個表來儲存)

資料結構之hash表

1.查詢的資料是表式結構,可以想象成是資料庫裡的表 2.查詢的目的是找出表中關鍵字與給定關鍵字相等的資料行 3.雜湊表就是定義了每乙個資料行的行號 4.雜湊演算法就是 行號 f 關鍵字 所以在雜湊表裡查詢資料時,不需要把給定關鍵字與每一行的關鍵字比較是否相等來找到行號,而是直接由給定的關鍵字計算出行...

資料結構 hash

雜湊表 hash table,也叫雜湊表 是根據鍵 key 而直接訪問在記憶體儲存位置的資料結構。分為兩個步驟 hash函式 通過乙個關於鍵值的hash函式,得到所查詢的資料對映到表中乙個位置。訪問資料 不同的key 經過hash函式 可能計算得到相同的輸出。此時叫做衝突,衝突的資料又成乙個表。一般...

資料結構專項之Hash函式

計算理論中,沒有hash函式的說法,只有單向函式的說法。所謂的單向函式,是乙個複雜的定義,大家可以去看計算理論或者密碼學方面的資料。用 人類 的語言描述單向函式就是 如果某個函式在給定輸入的時候,很容易計算出其結果來 而當給定結果的時候,很難計算出輸入來,這就是單項函式。各種加密函式都可以被認為是單...