海量数据Hash以及BloomFilter

一、Hash相关知识

散列表、bloom过滤器以及分布式一致性hash相关内容知识。

二、散列表

  1. hash函数以及冲突处理
  2. 散列表(哈希表)
  3. 布隆过滤器 mysql当中 Rockdb
  4. hyperloglog redis中的数据结构
  5. 分布一致性hash redis中的集群

1. 与二叉平衡树比较

  1. 二叉平衡树通过比较,结构有序,提升搜索的效率。 时间复杂度log2n
  2. key与节点存储位置的映射关系,直接根据搜索函数找到索引位置。O(1)

2. 组成

  1. hash函数。计算方式:hash(key)%size = index
  2. 数组 链表。

3. hash函数

  1. 作用:映射关系;
  2. 选择hash。a. 计算速度快;b.强随机性;3. murmurhash2、cityhash、siphash

4. 操作流程

分为搜索和查找。

5. 冲突

  1. 产生冲突的原因。key重复;hash函数映射范围不足;
  2. 负载因子:描述冲突的激烈程度;
  3. 解决冲突的方法:a. 负载因子在合理范围内。链表法以及开放寻址法
    b.负载因子不在合理范围内。1. >size 扩容。 2. <0.1倍率的size,缩容。 两种方法均需要通过rehash重新计算index。

6. stl散列表的实现

  1. unordered *
  2. 为了实现迭代器,后面讲具体节点串成一个单链表

三、布隆过滤器

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。

  1. 首先,将文件分为10等份,这样可以保证每个文件的大小在2GB内存限制之内。因为我们无法一次性将全部数据加载到内存中。
    2.使用哈希函数将数据分布到不同的文件中,这样可以确保相同的整数会被哈希到同一个文件中。这是一种常用的技巧,可以帮助我们处理较大的数据集。
  2. 对每个文件使用散列表统计出现次数最多的值。这种做法是正确的,通过维护一个键值对(key-value)的散列表,可以记录每个整数出现的次数。
  3. 考虑极端情况,如果某个整数的出现次数已经超过了所有整数数量的一半,那么可以直接返回该整数作为结果。这是一种有效的优化策略,因为只有可能出现次数超过一半的整数才有可能成为结果。
  4. 最后,比较并取出10个文件中出现次数最多的整数作为最终结果。这样做是合理的,通过比较每个文件中出现次数最多的整数,可以找到整个数据集中出现次数最多的整数。

分布式一致性hash

1. 解决什么问题

解决分布式缓存扩容的问题。

2. 怎么解决

通过固定算法解决缓存失效的问题。

3. 要点

a. 避免缓存失效
通过固定算法以及数据迁移。
b. 保证数据均衡
通过虚拟节点的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值