數據結構之Hash table

數據結構之Hash table

什麼是Hash table

Hash table(哈希表,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。

hash

Hash,一般翻譯做散列、雜湊,或音譯爲哈希,是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。

Hash算法也被稱爲散列算法,Hash算法雖然被稱爲算法,但實際上它更像是一種思想。Hash算法沒有一個固定的公式,只要符合散列思想的算法都可以被稱爲是Hash算法。

常用的hash函數

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爲增量序列,可有下列三種取法:

  • di=1,2,3,…,m-1,稱線性探測再散列;
  • di=12,-12,22,-22,32,…,±k2,(k<=m/2)稱二次探測再散列;
  • di=僞隨機數序列,稱僞隨機探測再散列。

2. 再散列法:Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函數,即在同義詞產生地址衝突時計算另一個散列函數地址,直到衝突不再發生,這種方法不易產生“聚集”,但增加了計算時間。

3. 鏈地址法(拉鍊法)

4. 建立一個公共溢出區

Java中的Hash

String類的hashCode方法如下所示

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;
    for (int i = 0; i < value.length; i++) {
        h = 31 * h + val[i];
    }
    hash = h;
}
return h;

Integer類的hashCode方法如下:

public int hashCode() {
    return Integer.hashCode(value);
}

public static int hashCode(int value) {
    return value;
}

HashMap即是採用了鏈地址法**,也就是數組+鏈表的方式。

HashMap:把元素的關鍵字 通過某個函數映射到數組中的某個位置

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章