就是根据给定的内存大小分批统计的策略,比如给我的内存只能处理100个数,而且每个数的范围是0~2^32,那么第一轮我只能统计范围从0~99的数,每次统计我肯定要把所有待处理的数都读一遍来确定:0是不是四个数组都出现了?1是不是四个数组都出现了?等等。在第二轮中,我只能统计范围100~199的数:100是不是四个数组都出现了?101是不是四个数组都出现了?.....以此类推。
[quote=引用 3 楼 u013118224 的回复:] 一个int占2个字节,100万占2000000个字节吧
hash一下就可以解决了,1M=1024KB=1024*1024Byte=1024*1024*8 bit 在内存中分配四个个1000000Bit也就是1000000/8/32 size大小的数组,数组中的每一位对应0-10000000的整数,分别遍历每个数组如果出现了某个整数就把内存中对应数组的位置1,重复的只记一次,4个数组都便利完成以后再对内存中的数组进行&操作就可以得出结果了
建立一个数组,初始化为-1 a[2^3][2^3][2^3][2^3],每个占16个字节,数组大小2^16(64K),若都是正数,还可以少一半。 之后就简单了,找出相同的数组成员,然后推算出原数就可以了。 赵老师是位好老师
有错 index{first, end, pos}[n] //n < 1M/3, pos为first在sorted_001中的位置 应该改为 index{first, end, first_pos, end_pos}[n]
排序使用外排序,分成4块,刚好1M,用快速排序排好,然后合并成一个文件 原来的4个文件都如此处理 快速排序在内存中,合并外存 然后读取每个文件的1/4M大小的数据,求相同 若比较完毕,取四段结尾最小的那个,继续读取1/4的数据,求相同 依次到最终结果 这一阶段,在内存中运行。 思路比较简单,可能不是最优。
64,670
社区成员
250,489
社区内容
加载中
试试用AI创作助手写篇文章吧