hash表學習資料

2021-05-25 05:13:31 字數 3806 閱讀 5368

資料結構:資料間關係 + 資料儲存方式。常見的資料結構有鍊錶,堆,棧,佇列,表,樹,圖等。選擇何種資料結構,取決於需要解決什麼樣的問題。

雜湊表(hash table),即雜湊表,是根據關鍵碼值(key value)而直接進行訪問的資料結構。其核心思想是選擇乙個雜湊函式或者隨機函式,用乙個和記錄相關的值作為函式的引數,生成存放該記錄的塊位址。這個演算法的優點是定址的時間複雜度是o(1),缺點是資料以無序的方式儲存。

將資料存入雜湊表時,利用雜湊函式為該資料安排儲存位置;查詢指定值資料時,也按照雜湊函式得到目標索引。實際操作起來時,由於數值域和索引域大小不同,所以不能簡單地線性對映,而是需要建立較複雜的雜湊函式,這就有可能造成「衝突」——這是雜湊面臨的主要問題。好的雜湊函式應該讓隨機資料值得到的雜湊結果盡可能地隨機和分散,而且減少衝突。

一般的說,hash函式可以簡單的劃分為如下幾類:

1. 加法hash;

2. 位運算hash;

3. 乘法hash;

4. 除法hash;

5. 查表hash;

6. 混合hash;

一 加法hash

所謂的加法hash就是把輸入元素乙個乙個的加起來構成最後的結果。標準的加法hash的構造如下:

view source

print?

staticintadditivehash(string key,intprime)

這裡的prime是任意的質數,看得出,結果的值域為[0,prime-1]。

二 位運算hash

這型別hash函式通過利用各種位運算(常見的是移位和異或)來充分的混合輸入元素。比如,標準的旋轉hash的構造如下:

view source

print?

staticintrotatinghash(string key,intprime)

先移位,然後再進行各種位運算是這種型別hash函式的主要特點。比如,以上的那段計算hash的**還可以有如下幾種變形:

1.     hash = (hash<<5)^(hash>>27)^key.charat(i);

2.     hash += key.charat(i);

hash += (hash << 10);

hash ^= (hash >> 6);

3.     if((i&1) == 0)

else

4.     hash += (hash<<5) + key.charat(i);

5.     hash = key.charat(i) + (hash<<6) + (hash>>16) – hash;

6.     hash ^= ((hash<<5) + key.charat(i) + (hash>>2));

三 乘法hash

這種型別的hash函式利用了乘法的不相關性(乘法的這種性質,最有名的莫過於平方取頭尾的隨機數生成演算法,雖然這種演算法效果並不好)。比如,

view source

print?

staticintbernstein(string key)

使用這種方式的著名hash函式還有:

view source

print?

//  32位fnv演算法

intm_shift = 0;

publicintfnvhash(byte data)

以及改進的fnv演算法:

view source

print?

publicstaticintfnvhash1(string data)

除了乘以乙個固定的數,常見的還有乘以乙個不斷改變的數,比如:

view source

print?

staticintrshash(string str)

return(hash & 0x7fffffff);

}

雖然adler32演算法的應用沒有crc32廣泛,不過,它可能是乘法hash裡面最有名的乙個了。關於它的介紹,大家可以去看rfc 1950規範。

四 除法hash

除法和乘法一樣,同樣具有表面上看起來的不相關性。不過,因為除法太慢,這種方式幾乎找不到真正的應用。需要注意的是,我們在前面看到的hash的結果除以乙個prime的目的只是為了保證結果的範圍。如果你不需要它限制乙個範圍的話,可以使用如下的**替代」hash%prime」: hash = hash ^ (hash>>10) ^ (hash>>20)。

五 查表hash

查表hash最有名的例子莫過於crc系列演算法。雖然crc系列演算法本身並不是查表,但是,查表是它的一種最快的實現方式。查表hash中有名的例子有:universal hashing和zobrist hashing。他們的**都是隨機生成的。

六 混合hash

混合hash演算法利用了以上各種方式。各種常見的hash演算法,比如md5、tiger都屬於這個範圍。它們一般很少在面向查詢的hash函式裡面使用。

字串雜湊函式:著名的elfhash演算法

view source

print?

intelfhash(char*key)

returnh%mod;

}

hash表學習筆記

一 hash表的基本概念和優缺點比較 hash表又稱雜湊表 是一種資料結構,與鍊錶 二叉樹有很大區別。1 hash表優缺點 優點 能夠在常數級的時間複雜度上進行查詢,並且插入資料和刪除資料簡單。hash未滿的時候速度很快 2 與鍊錶比較 鍊錶 查詢上表中的資料從頭開始遍歷,直到查到或者查詢失敗。ha...

hash表 hash演算法

概念 雜湊表 hash table。也叫雜湊表 是依據關鍵碼值 key value 而直接進行訪問的 資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對隨意給定的keyword值ke...

資料結構hash表

看乙個實際需求,google公司的乙個上機題 有乙個公司 當有新的員工來報道時 要求將該員工的資訊加入 id,性別,年齡,住址.當輸入該員工的id時 要求查詢到該員工的 所有資訊.要求 不使用資料庫 盡量節省記憶體 速度越快越好 雜湊表 雜湊 雜湊表 hash table 也叫雜湊表 是根據關鍵碼值...