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