如何给100亿个数字排序?

今天要给100亿个数字排序,100亿个 int 型数字放在文件里面大概有 37.2GB,非常大,内存一次装不下了。那么肯定是要拆分成小的文件一个一个来处理,最终在合并成一个排好序的大文件。

NetSmell 出品

今天要给100亿个数字排序,100亿个 int 型数字放在文件里面大概有 37.2GB,非常大,内存一次装不下了。那么肯定是要拆分成小的文件一个一个来处理,最终在合并成一个排好序的大文件。

实现思路

1.把这个37GB的大文件,用哈希分成1000个小文件,每个小文件平均38MB左右(理想情况),把100亿个数字对1000取模,模出来的结果在0到999之间,每个结果对应一个文件,所以我这里取的哈希函数是 h = x % 1000,哈希函数取得”好”,能使冲突减小,结果分布均匀。

2.拆分完了之后,得到一些几十MB的小文件,那么就可以放进内存里排序了,可以用快速排序,归并排序,堆排序等等。

3.1000个小文件内部排好序之后,就要把这些内部有序的小文件,合并成一个大的文件,可以用二叉堆来做1000路合并的操作,每个小文件是一路,合并后的大文件仍然有序。

  • 首先遍历1000个文件,每个文件里面取第一个数字,组成 (数字, 文件号) 这样的组合加入到堆里(假设是从小到大排序,用小顶堆),遍历完后堆里有1000个 (数字,文件号) 这样的元素
  • 然后不断从堆顶拿元素出来,每拿出一个元素,把它的文件号读取出来,然后去对应的文件里,加一个元素进入堆,直到那个文件被读取完。拿出来的元素当然追加到最终结果的文件里。
  • 按照上面的操作,直到堆被取空了,此时最终结果文件里的全部数字就是有序的了。

最后我用c++写了个实验程序,具体代码在这里可以看到。

如何拆分大文件?

一个32G的大文件,用fopen()打开不会全部加载到内存的,然后for循环遍历啊,把每个数字对1000取模,会得到0到999种结果,然后每种结果在写入到新的文件中,就拆分了

显示余下内容
相关文章:
  1. 如何用Python实现八大排序算法
  2. 苹果史上最“炸场”芯片们来了,MacBook Pro刘海屏你怕了吗
  3. 你伤害了我,想一笑而过?微博新版怎么做好用户体验
  4. 就差价格了 一加Nord 2 5G手机官方透露信息汇总
  5. iOS端Chrome 92发布:支持整页截图 优化隐私保护
  6. 知情人士:李书福手机业务首款产品将于1-2年内推出
  7. 美股周一:中概教育股普涨 好未来涨超10%
  8. 重大考古发现:汉文帝霸陵出土过千件裸体陶俑
  9. 中国反守为攻 中美进入“谁先眨眼睛”阶段
  10. 电商那么“卷”,阿里还“稳”吗?
 

发表评论

您的电子邮箱地址不会被公开。