【算法学习】哈希函数和哈希表

1. 例题

在这里插入图片描述
直接使用哈希表需要32g不合理
改进:
在这里插入图片描述

2. 哈希表原理

底层是哈希函数和链表
在这里插入图片描述
某个格子串的链表可能过长,扩容(增加格子数),然后将17个格子的东西放到新的格子里。
哈希表在使用中增删改查是O(1)时间复杂度
哈希表有许多改进:

  • 开发地址表
  • 链表换成有序树

3. 设计数据结构

在这里插入图片描述
解:
map1(str -> index)
map2 (index -> str)
int size=0
(1)delete():
删除某个index后,把最后一个str移过去(为了保证index连续,避免random时出现空)

(2)getRandom():
random一下size,然后返回

4. 布隆过滤器

  • 解决类似于黑名单系统或者爬虫去重
  • 建立一个集合结构,有添加和查询,但没有删除
  • 传统的哈希表做法需要的内存太大了
  • 误报失误包含两种:是黑名单,判断成不是;不是黑名单,判断是。布隆过滤器中没有第一种失误,并且第二种失误率低

4.1 位图

在这里插入图片描述
(1)获取第178位的信息
在这里插入图片描述
(2)修改第178位信息为1
在这里插入图片描述
修改为0呢
在这里插入图片描述

4.2 布隆过滤器

实质是一个大位图

  • 添加:对于某个url,使用k个hash函数得到k个结果,然后模m,在0~(m-1)的位图中将对应的k个位置描黑
  • 查询:对于某个url,使用k个hash函数得到k个结果,然后模m,只有对应的k个位置都黑才说明在黑名单

失误率:
在这里插入图片描述
在这里插入图片描述
设计:
在这里插入图片描述

5. 一致性哈希

在这里插入图片描述
传统底层数据服务器存储是用哈希值取模的方法,那么如果高频,中频,低频取模后在数据服务器上均匀分布,则认为负载均衡

改进为一致性哈希:
数据hash后然后归属到环上顺时针离它最近的m中
在这里插入图片描述
好处是在环上增加一个机器m4时数据迁移的代价小,只用迁移增加处的数据
问题:

  • 机器数少的时候可能做不到均分环
  • 增加减少机器可能导致负载不均衡

解决:虚拟节点技术
假设每个机器m都有1000个虚拟节点,现在抢环不是m抢,是3000个虚拟节点抢,按比例抢环

一致性哈希还有一个妙用,管理负载。即可以根据实际机器的状况给机器分布不同数量的虚拟节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值