海量数据查重问题一网打尽:哈希表、位图、布隆过滤器
一、概述
在面试的时候可能经常会问道海量数据的查重问题,大概就是在有限的内存空间中进行数据的查重。在实际场景中,哈希表、位图、布隆过滤器都能发挥自己作用。下面概述一下三种数据结构的特点:
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的内存空间,很明显不够用。因此,这里可以采用分治+哈希表的思想,把大文件分到多个小文件中,对比小文件是否

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

被折叠的 条评论
为什么被折叠?



