C++ hash
STL c++ hash_table 分析
簡介
- 由索引到值的數據結構(data structure that maps keys to values)
- 直接映射,需要很大的空間。空間的利用率不高,爲了將某一元素映射到一個“大小可以接受之索引”,這樣的函數爲hash function(散列函數或者哈希函數)。通常的哈希函數爲取模。
哈希函數(hash function)
h(key) => hash table index
好的哈希函數特點
- 易於計算
- 分佈均勻(Reduce chance of collision)
- different keys should ideally map to different indices
- distribute keys uniformly over table
複雜度(complexity)
- 最好情況O(1)查找
- 最壞情況O(N)發生了衝突(collisions)
對於string類型哈希函數的設計
- 簡單的ASCII碼值相加,隱患很大
- 使用前三個字符,以27爲基,計算key值
- 使用所有字符,以比字符個數大的質數爲基。26個字母,則選擇,29,31,37
解決衝突的辦法
- 分離鏈路(Chaining):在哈希表索引同樣的地方,以鏈表的形式存儲value
- 開放地址(Open addressing):
- 二次哈希(double hash)