HashTable-散列表/哈希表,是根據關鍵字(key)而直接訪問在內存存儲位置的數據結構。 它經過一個關鍵值的函數將所需的數據映射到表中的位置來訪問數據,這個映射函數叫作散列函數,存放記錄的數組叫作散列表。html
構造哈希表的幾種方法
1. 直接定址法--取關鍵字的某個線性函數爲散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B爲常數。 git
2. 除留餘數法--取關鍵值被某個不大於散列表長m的數p除後的所得的餘數爲散列地址。Hash(Key)= Key % P。 github
3. 平方取中法 算法
4. 摺疊法 segmentfault
5. 隨機數法 數組
6. 數學分析法數據結構
哈希衝突/哈希碰撞
不一樣的Key值通過哈希函數Hash(Key)處理之後可能產生相同的值哈希地址,咱們稱這種狀況爲哈希衝突。任意的散列函數都不能避免產 生衝突。函數
處理哈希衝突的閉散列方法:
1. 線性探測spa
2. 二次探測code
處理哈希衝突的開鏈法(哈希桶):
素數表(使用素數作除數能夠減小哈希衝突) // 使用素數表對齊作哈希表的容量,下降哈希衝突
// 使用素數表對齊作哈希表的容量,下降哈希衝突 const int _PrimeSize = 28; static const unsigned long _PrimeList [_PrimeSize] = { 53ul, 97ul, 193ul, 389ul, 769ul,
1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
1610612741ul, 3221225473ul, 4294967291ul };
字符串哈希算法
http://www.cnblogs.com/-clq/archive/2012/05/31/2528153.html
哈希表的應用之布隆過濾器:
當一個元素被加入集合時,經過 K
個 Hash 函數
將這個元素映射成一個位陣列(Bit array)中的 K 個點
,把它們置爲 1
。檢索時,咱們只要看看這些點是否是都是 1 就知道集合中有沒有它了:
若是這些點有任何一個 0,則被檢索元素必定不在;
若是都是 1,則被檢索元素極可能在。
布隆過濾器的博文:
https://segmentfault.com/a/1190000002729689
http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html
相應的源代碼請點擊:https://github.com/shihaokiss