海量数据查重问题一网打尽:哈希表、位图、布隆过滤器

本文详细介绍了在处理海量数据查重问题时,哈希表、位图和布隆过滤器的应用。哈希表适用于内存充足的情况,位图通过压缩空间提高效率,但可能因数据分布不均造成浪费。布隆过滤器则通过多哈希函数减少空间浪费,但存在误判风险。在实际操作中,需根据内存限制和数据特性选择合适的数据结构。

海量数据查重问题一网打尽:哈希表、位图、布隆过滤器

一、概述

在面试的时候可能经常会问道海量数据的查重问题,大概就是在有限的内存空间中进行数据的查重。在实际场景中,哈希表、位图、布隆过滤器都能发挥自己作用。下面概述一下三种数据结构的特点:

1. 哈希表使用的内存是最多的。在使用哈希的表过程中,需要一大块连续的内存空间。而且内存空间一般是存储元素的两倍。

2. 位图在某些情况下大大压缩了哈希表的使用空间。在使用的过程中,位图其实也需要开辟一段连续的内存空间,但是因为其数据底层用一个位来表示一个key的状态,极致的压榨了空间的利用率。但是一个位往往只能表示”是“、”否“这两个状态。其次,位图通常根据数据中的最大值来开辟数组的大小,因此可能在数据分布不均匀,存在个别大数的情况下造成空间的浪费。

3. 布隆过滤器解决了位图中”数据分布不均匀,存在个别大数而导致空间资源的浪费“这个问题。但是,对于布隆过滤器来说,它没办法删除一个key,也会存在数据的误判问题。

因此,在海量数据查重的时候,需要具体情况具体分析来选择合适的数据结构。

二、哈希表

在C++中的STL中,无序容器中的unordered_set、unordered_map、unordered_multiset、unordered_multimap就是使用哈希表实现的,具体的用法不再赘述。下面讨论的是哈希表在有限空间中的使用。

比如有个需求:两个文件中都有一亿条数据,每条数据为4个字节,现在只有10M的内存,如何找到两个文件中重复的数据?

如果直接把两个文件读到内存中的话,大概需要800M的内存空间(1亿约等于100M,100 * 4 * 2 = 800)。而只读取一个文件,另一个文件一条条依次读取的话也需要400M的内存空间,很明显不够用。因此,这里可以采用分治+哈希表的思想,把大文件分到多个小文件中,对比小文件是否

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值