HashTable-散列表/哈希表
是根據關鍵字(key)而直接訪問在內存存儲位置的數據結構。
它通過一個關鍵值的函數將所需的數據映射到表中的位置來訪問數據,這個映射函數叫做散列(哈希)函數,存放記錄的數組叫做散列表。
構造哈希表的幾種方法
1.直接定址法(取關鍵字的某個線性函數為哈希地址)
2.除留余數法(取關鍵值被某個不大於散列表長m的數p除后的所得的余數為散列地址)
3.平方取中法
4.折疊法
5.隨機數法
6.數學分析法
常用方法是直接定址法和除留余數法
哈希沖突/哈希碰撞
不同的Key值經過哈希函數Hash(Key)處理以后可能產生相同的值哈希地址,我們稱這種情況為哈希沖突。任意的散列函數都不能避免產生沖突。
處理哈希碰撞的方法
若key1,key2,key3產生哈希沖突(key1,key2,key3值不相同,映射的哈希地址同為key),用以下方法確定它們的地址
1.閉散列法
1)線性探測
若當前key與原來key產生相同的哈希地址,則當前key存在該地址之后沒有存任何元素的地址中
key1:hash(key)+0
key2:hash(key)+1
key3:hash(key)+2
例如:
2)二次探測
若當前key與原來key產生相同的哈希地址,則當前key存在該地址后偏移量為(1,2,3...)的二次方地址處
key1:hash(key)+0
key2:hash(key)+1^2
key3:hash(key)+2^2
例如:
2.開鏈法(哈希桶)
哈希表中保存包含每個key值的節點,每個節點有一個_next的指針,指向產生哈希沖突的key的節點
例如:
具體實現方式請看下一篇博客,博客鏈接:http://blog.csdn.net/xyzbaihaiping/article/details/51610944