100亿个数排序
先将数分为100份,即分到100个小文件中,然后逐个文件排序,最后采用多路归并排序,写入一个大文件中。
1 但是,这种朴素做法每次都要比较100次,才能确定当前最小值,所以,这部分可以优化,即建立一个最小堆,每个值为pari(num,fd),每次将堆顶元素踢出,从踢出数所属的文件中再读入一个元素。
2 前面逐个文件排序的时候,可以并行,排序是耗cpu,读写数据耗io.所以可以利用cpu,io进行并行处理。
100亿个数求top k。
单核时,直接用堆处理,建立一个k大小的堆,多核时,将其分为100份,然后多核并行找出当个文件的top k,然后再归并。
100亿个 数/字符串 求频率最高的top k个
用hash(num)%100将数分到100个文件当中,然后用hashmap求出每个频率,如果是字符串的话,这步可以用tries来统计频率。然后用堆找出top k个,然后100个文件的top k进行比较,即可求出最高的top k。
1亿整数求重复
数据量在比较小,可以用位图解决,1亿个数,2bit*1亿/8的位图,内存可以承受,即用位图的话,数据量减少为1/4。
两个存储100亿url文件查找重复项
文件a,先用hash(url)%100分为100,文件b照做,因为采用相同的hash,所以相同的url会出现在相同的文件中,所以只要比较a1 b1,a2 b2 等等即可,a1 vs b1 的话,可以用较小的那个文件建立hashmap,然后比较大的那个文件从hashmap中找,是否存在该项。
海量数据求中位数
- 类似快排方法,随便从中取出一个数,然后比这个数小的,分到file0中,比这个数大的,分到file1中,如果file0有40个,file1有60个,则说明中位数在file1文件中,继续从文件file1用这种方法,直到数据可以发到内存,就直接用排序。
- 用hash把大文件变小,file文件有100亿个,将其分为10份,划分的时候,按照大小来划分,例如char类型,最大为127,划分为10份,每份间隔127/10=12,所以第一份为0-12,第二份13-25,依次类推统计每个文件中个数,然后就可以看出中位数在10个文件中的哪个,然后在该文件中继续用这种方法划分查找,直到找到。