哈希原理及应用

哈希冲突

一般来说,哈希表每个值的索引常常是通过对一个质数取模得到的。
比如以3为模数

hash1 = 1
hash2 = 2
hash3 = 3
hash4 = 1 (出现冲突)

这里4和1会出现同样的索引,就发生了哈希冲突。

开链法

开链法会把每个哈希表里的桶以链表形式组织,然后遇到哈希冲突就将其添加到对应桶的链表最末尾。这样做即解决了哈希冲突,又保证了顺序,同样以3为模数,举例如下

bin0 : 0->3->6...
bin1 : 1->4->7...
bin2 : 2->5->8...

STL中的unordered_set和unordered_map就使用的这种方法。

位图(bitmap)

bitmap是一种非常高效的数据结构,可以用来查询数据是否被使用。
一般来说位图有两种,一种是按照数组索引直接来查询,还有一种是利用hash进行映射,然后用来查询,时间复杂度为O(1),存在哈希冲突问题

布隆过滤器

也是哈希函数的一个非常重要的应用
组成要素:一个数组,多个哈希函数
过程:给一个值,将其利用不同hash函数计算得到多个映射位置.当要查找一个值的时候,如果发现这个值对应的位图有位置为0,说明这个值一定不存在。但是如果发现这个值对应的位图全部为1,也不能保证这个值一定存在。
举例:

A:1 3 5 -> 0101010
B:2 3 6 -> 0011001
所以位图的1 2 3 5 6位都被置1
所以查询C:1 4 5 ,40,一定不存在C
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值