前言
本文章为学习笔记,总结下常用的算法
一、哈希算法的扫盲参考
参考:
哈希算法(哈希函数)基本
哈希(HASH)算法总结
Hash算法总结
哈希函数
数据结构—— 构造散列函数的六种方法
哈希表、哈希桶的实现
解决哈希冲突的三种方法(拉链法、开放地址法、再哈希法)
二、Hash函数算法
1.除留余数法
将key通过hash函数生成hashcode,然后与hash桶的数量进行取余,结果用于确定将该值存放在哪个桶中。
假设:hash(key) = key + 1 ,hash桶数量为4
(key, value) | hashcode | 取余后 |
---|---|---|
( 1, 6) | 2 | 2 |
( 3, 8) | 4 | 0 |
( 8,10) | 9 | 1 |
(16, 1) | 17 | 1 |
优点:使用场景广泛,不受限制。
缺点:存在哈希冲突,需要解决哈希冲突,哈希冲突越多,效率下降越厉害
2.平方取中法
取key平方后的中间几位作为散列地址
key | key2 | 取中间3位 |
---|---|---|
211 | 44,521 | 452 |
985 | 970,225 | 702 |
468 | 219,024 | 190 |
使用场景:不知道关键字的分布,而位数又不是很大。
3.随机数法
选择一随机函数,取key的随机值作为散列地址
使用场景:关键字长度不等时。
三、Hash碰撞
1.拉链法(开散列)
发生哈希冲突的位置,生成一个链表,用来存储hash冲突的元素
2.开放地址法(闭散列)
发生哈希冲突位置开始,依次向后探测,指导找到下一个空位置为止。
3.再哈希法
发生哈希冲突时,再次哈希得出散列地址,直至不发生冲突位置