题目:有四个文件,每个文件中存有100万个int型整数,内存限制1M,该如何最优地得到四个文件的交集数,也就是在四个文件都出现的数的个数?
我的想法:因为内存限制1M,也就是1024*1024个字节,小于一个文件中所有数所占的存储100 0000*4,所以文件中的数没办法一次装到内存。采用外部排序、归并等方法实现。
具体:
1、最开始应该是对每个大文件进行外部排序,也就是n次从大文件中取出一部分数在内存中进行快速排序或堆排序,然后将结果存入小文件中,存入小文件的同时去重;
2、然后对n个小文件进行归并排序,将已排序结果存入新的大文件。这样能得到四个没有重复数的新的大文件;
3、接下来对这四个已排序的文件,设为f1,f2,f3,f4进行类似归并操作,两个指针一开始指向f1与f2的头部,值不相等的“丢掉”,相等的存入新的文件f12,f3,f4进行一样操作得到f34文件,再对这两个文件进行上诉操作,得到最终结果文件result,同时可以得到其个数。
我发了个帖子收集各位的算法,有的用bitmap实现,有的用多趟遍历实现,各位可以看看还有什么优化的方法。
http://bbs.csdn.net/topics/390889640
原文地址:http://blog.csdn.net/u012999424/article/details/39403157