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