如何在大量的数据中找出不重复的整数

Posted hardy-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在大量的数据中找出不重复的整数相关的知识,希望对你有一定的参考价值。

题目描述:

在 2.5 亿个整数中找出不重复的整数。注意:内存不足以容纳这 2.5 亿个整数。

分析与解答:

由于这道题目与前面的题目类似,也是无法一次性把所有数据加载到内存中,因此也可以采用类似的方法求解。
方法一:分治法
采用 hash 函数的方法,把这 2.5 亿个整数划分到更小的文件中,从而保证每个文件的大小不超过可用的内存大小。然后对每个小文件而言,所有的数据都可以一次性被加载到内存中,因此可以使用 hash_map 或 hash_set 来找到每个小文件中不重复的整数。当处理完所有的文件后就可以找出这 2.5 亿个整数中所有的不重复的整数。
方法二:位图法
对于整数相关的算法的求解,位图法是一种非常实用的算法。对本题而言,如果可用的内存空间超过 1GB 就可以使用这种方法。具体思路:假设整数占用 4B(如果占用 8B,则求解思路类似,只不过需要占用更大的内存),也就是 32bit,可以表示的整数的个数为 232。由于本题只查找不重复的数,而不关心具体数字出现的次数,因此可以分别使用 2 个 bit 来表示各个数字的状态:用 00 表示这个数字没有出现过,01 表示出现过 1 次,10 表示出现了多次, 11 暂不使用。
根据上面的逻辑,在遍历这 2.5 亿个整数时,如果这个整数对应的位图中的位为 00,那么就修改成 01;如果为 01,则修改为 10;如果为 10,则保持原值不变。这样当所有数据遍历完成后,可以再遍历一遍位图,位图中值为 01 的 bit 对应的数字就是没有重复的数字。






以上是关于如何在大量的数据中找出不重复的整数的主要内容,如果未能解决你的问题,请参考以下文章

经典的海量数据处理面试题

java 中如何 找出两个集合中的不重复的元素

mysql中如何找出重复数据的所有行

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

最长连续不重复子序列

剑指offer第1题找出数组中重复的数字