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)