惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
C
Check Point Blog
Last Week in AI
Last Week in AI
F
Fortinet All Blogs
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG

博客园 - 小默同学

C语言文件操作 makefile 文件的写法 tkinter教程 基本黑客技术 window下开机自启动.bat文件和后台启动.bat文件 django 用 uvicorn 部署 python 声音去噪处理 basis of PHP DBMA about mysql 免费文字转语音工具 折半查找python代码实现 c:\windows\temp\ccvjvr7w.o:problemfour.cpp:(.text+0x17): undefined reference to `std::basic_istream< - 小默同学 Android连接第三方模拟器 vscode下搭建springboot python jwt 一篇文章极速复习drf知识点 LCD1602代码记录 {&quot;detail&quot;:[{&quot;loc&quot;:[&quot;body&quot;],&quot;msg&quot;:&quot;field required&quot;,&quot;type&quot;:&quot;value_error.missing&quot;}]} 防止win10系统把破解软件当成病毒自动删除keil的破解软件 ERROR 1366 (HY000): Incorrect string value: '\xC4\xE3\xBA\xC3' for column 'p - 小默同学
外部排序
小默同学 · 2022-09-10 · via 博客园 - 小默同学

外部排序步骤分为三步:

  1. 首先先内部排序
  2. 然后再不断地进行归并排序

所以外部排序时间 = 内部排序时间 + 磁盘读写时间 + 内部归并排序所需要的时间

减少磁盘读写时间

一趟磁盘读写时间最消耗时间,所以要减少磁盘读写的趟数,所以引入了多路平衡归并,这样可以减少磁盘读写的趟数。

所谓平衡归并,我自己的话来讲就是尽可能多的进行归并。对m个初始段进行k-路平衡归并所需要的趟数为 \(\lceil log_km \rceil\)

但是减少磁盘趟数会带来负面影响:

  1. 会使内部排序时间增多,因为引入了多路平衡归并。
  2. 由于有多个归并段,会使内存消耗变大。
  3. 内部归并排序所需要的时间会增多。

减少磁盘读写时间后产生的负面影响

为了减少第一个负面影响,引入“置换选择排序”。

为了减少第三个负面影响,引入“败者树”。

败者树(Tree of loser)

就是类似于两两比武最后决斗得出冠军。败者树使k个记录中关键字比较次数从 \(k-1\) 次变成了 \(\lceil log_2k \rceil\) 次。

置换选择排序(Replacement-selection sorting)

通过置换选择排序可以划分为更少的长度不等的归并段。

最佳归并树

就是哈夫曼树加上虚段。

如果:

  • (初始个数-1) % (k-1) == 0:说明不需要补充虚段。
  • (初始个数-1) % (k-1) == n: 说明要补充初始个数-1-n个虚段。