數據結構與算法目錄(http://www.javashuo.com/article/p-qvigrlkr-da.html)html
散列表(Hash table) 也叫哈希表,是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它經過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫作 散列函數 ,存放記錄的數組叫作 散列表。java
散列表 Hash table(key,value) 就是把 Key 經過一個固定的算法函數即散列函數轉換成一個整型數字,而後就將該數字對數組長度進行取餘,取餘結果就看成數組的下標,將 value 存儲在以該數字爲下標的數組空間裏。經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。算法
而當使用哈希表進行查詢的時候,就是再次使用哈希函數將 key 轉換爲對應的數組下標,並定位到該空間獲取 value,如此一來,就能夠充分利用到數組的定位性能進行數據定位。數組
關鍵碼自己和地址之間存在某個線性函數關係時,散列函數取爲關鍵碼的線性函數,即:H(key)=a*key+b,a、b均爲常數。
這樣的散列函數優勢就是簡單、均勻,也不會產生衝突,但問題是這須要事先知道關鍵字的分佈狀況,適合査找表較小且連續的狀況。因爲這樣的限制,在現實應用中雖然簡單,但卻並不經常使用。數據結構
經過選擇適當的正整數 p,按計算公式 H(K) = K mod p 來計算關鍵碼K的散列地址。dom
若關鍵碼個數爲 n,散列表表長爲 m(通常 m >= n),一般選 p 爲小於或等於表長 m 的最大素數或不包含小於 20 的質因子的合數,通常也要求 p >= n。數據結構和算法
這種方法計算最簡單,也不需根據所有關鍵碼的分佈狀況研究如何從中析取數據,最經常使用。函數
將關鍵碼 K 平方,取 K^2 中間幾位做爲其散列地址 H(K) 的值。性能
假若有如下關鍵字序列 {421,423,436},平方以後的結果爲 {177241,178929,190096},那麼能夠取 {72,89,00} 做爲 Hash 地址。htm
採用隨機函數做爲散列函數 H(Key) = random(Key),其中 random 爲隨機函數。當關鍵碼長度不等時,採用該方法較恰當。
創建一個緩衝區,把凡是 Hash(key) 重複的元素放到緩衝區中。當我經過 key 查找時,發現找的不對,就在緩衝區裏找。
具體的關鍵字列表爲(19,14,23,01,68,20,84,27,55,11,10,79),則散列函數爲 H(key) = key MOD 13。則採用除留餘數法和拉鍊法後獲得的預想結果應該爲:
天天用心記錄一點點。內容也許不重要,但習慣很重要!