Hash应用

14 篇文章 0 订阅

目录

1.位图

1.1 位图概念

1.2 位图的应用场景

2.布隆过滤器

2.1 布隆过滤器概念

2.2 布隆过滤器的应用

3.哈希切割


1.位图

1.1 位图概念

数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如:

所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。

优点:处理海量数据,占用内存小,速度快

缺点:只能映射整形,其他类型,比如浮点数,string等等不能储存映射

1.2 位图的应用场景

1. 快速查找某个数据是否在一个集合中

例题:

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】

用位图40亿个不重复的无符号整数,所以要开2^32个byte = 512M

遍历集合,然后在位图中判断是否存在

给定100亿个整数,设计算法找到只出现一次的整数? 

开两个位图,在相同的位置00代表没有出现过,10代表只出现一次,11代表出现两次及以上

位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数 

开两个位图,在相同的位置00代表没有出现过,10代表只出现一次,01代表出现两次,11代表出现两次以上

2. 排序 + 去重

3. 求两个集合的交集、并集等

给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

1.放两个位图里面,如果两个位置都为真,就是交集

2.先遍历一个文件放到一个位图中,然后读取第二个文件的值去查询,如果存在就是交集,然后还要把位图对应的位置置零,为了去重

如果文件中的数目比较多,选1,反正选2

4. 操作系统中磁盘块标记


2.布隆过滤器

2.1 布隆过滤器概念

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。

布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特 位一定为1。

所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位置存储的是否为零,只要有一个为零,代表该元素一定不在哈希表中,否则可能在哈希表中。 

注意:布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可 能存在,因为有些哈希函数存在一定的误判。

布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素。

优点:速度快,节省内存, 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势

缺点:有误判(存在),不能删除,如果采用计数方式删除,可能会存在计数回绕问题

2.2 布隆过滤器的应用

1. 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

1.近视算法:放两个布隆过滤器中,如果两个都存在为交集

2.精确算法:一个query算它50字节,100亿个相当于500G,所以必须要切割成很多个小文件,才能放在内存中

首先哈希切割,felti = Hashfunc(query)%1000,交集算出来的felti一定是一样的,所以需要相同的文件标号进行比较就可以

然后就是比较的问题,把一个文件的query都放进set/unordered_set,然后读取另一个query

在set里面查询

如果哈希切割把一个文件切的太大了,就会导致set插入抛异常,就需要换哈希函数进一步切割这个小文件,然后比较

2. 如何扩展BloomFilter使得它支持删除元素的操作

一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计 数器(k个哈希函数计算出的哈希地址)加一,删除元素时,给k个计数器减一,通过多占用几倍存储 空间的代价来增加删除操作。


3.哈希切割

切割大文件,felti = Hashfunc(Key)% N

给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,如何找到top K的IP?

首先哈希切割,felti = Hashfunc(log)%1000,相同的 log算出来的felti一定是一样的,所以需要相同的文件标号进行比较就可以

然后就是比较的问题,把一个文件的 log都放进map/unordered_map,然后读取另一个文件的log放在map里面计数

如果哈希切割把一个文件切的太大了,就会导致map插入抛异常,就需要换哈希函数进一步切割这个小文件,然后比较

每次两个文件map计数后找到最大的那个ip

topk,就多放一个k的小堆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值