文章目录
一、Hash相关知识
散列表、bloom过滤器以及分布式一致性hash相关内容知识。
二、散列表
- hash函数以及冲突处理
- 散列表(哈希表)
- 布隆过滤器 mysql当中 Rockdb
- hyperloglog redis中的数据结构
- 分布一致性hash redis中的集群
1. 与二叉平衡树比较
- 二叉平衡树通过比较,结构有序,提升搜索的效率。 时间复杂度log2n
- key与节点存储位置的映射关系,直接根据搜索函数找到索引位置。O(1)
2. 组成
- hash函数。计算方式:hash(key)%size = index
- 数组 链表。
3. hash函数
- 作用:映射关系;
- 选择hash。a. 计算速度快;b.强随机性;3. murmurhash2、cityhash、siphash
4. 操作流程
分为搜索和查找。
5. 冲突
- 产生冲突的原因。key重复;hash函数映射范围不足;
- 负载因子:描述冲突的激烈程度;
- 解决冲突的方法:a. 负载因子在合理范围内。链表法以及开放寻址法
b.负载因子不在合理范围内。1. >size 扩容。 2. <0.1倍率的size,缩容。 两种方法均需要通过rehash重新计算index。
6. stl散列表的实现
- unordered *
- 为了实现迭代器,后面讲具体节点串成一个单链表
三、布隆过滤器
1. 背景
a. 内存有限,只想确定某个key存不存在,不想知道具体内容。
b. 某个文件中是否存在这个内容。
c. 某个数据库是否存在某个key。
2. 构成
位图+n个hash函数
3. 如何操作
hash(key) % bit_size = index
4. 要点
a. 确定某个key一定不存在,可控假阳率确定存在。
b. 不能删除。
c. 根据n、p计算出m和k。
大数据中的面试问题:只用2GB内存在20亿个整数中找到出现次数最多的数,如何实现? 类似问题:单台机器处理不了,分流到多台机器处理。
key:整数 value:出现的次数
关键:两次hash。
- 首先,将文件分为10等份,这样可以保证每个文件的大小在2GB内存限制之内。因为我们无法一次性将全部数据加载到内存中。
2.使用哈希函数将数据分布到不同的文件中,这样可以确保相同的整数会被哈希到同一个文件中。这是一种常用的技巧,可以帮助我们处理较大的数据集。 - 对每个文件使用散列表统计出现次数最多的值。这种做法是正确的,通过维护一个键值对(key-value)的散列表,可以记录每个整数出现的次数。
- 考虑极端情况,如果某个整数的出现次数已经超过了所有整数数量的一半,那么可以直接返回该整数作为结果。这是一种有效的优化策略,因为只有可能出现次数超过一半的整数才有可能成为结果。
- 最后,比较并取出10个文件中出现次数最多的整数作为最终结果。这样做是合理的,通过比较每个文件中出现次数最多的整数,可以找到整个数据集中出现次数最多的整数。
分布式一致性hash
1. 解决什么问题
解决分布式缓存扩容的问题。
2. 怎么解决
通过固定算法解决缓存失效的问题。
3. 要点
a. 避免缓存失效
通过固定算法以及数据迁移。
b. 保证数据均衡
通过虚拟节点的方法。