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个虚拟节点抢,按比例抢环
一致性哈希还有一个妙用,管理负载。即可以根据实际机器的状况给机器分布不同数量的虚拟节点。