外部排序是什么

外部排序是啥:
想象一下,你有一个超级大的书架,书太多,一次拿不完,所以得分批拿,这就是外部排序。电脑里也是这样,文件太大,内存装不下,就得从硬盘上分批读取数据到内存里,然后再排序。
为啥要用归并排序:
归并排序就像是你先把书分成一小堆一小堆的,每堆都排好序,然后再把排好序的小堆合并成大堆,最后整个书架的书就都排好序了。
I/O次数是啥:
I/O次数就是你从硬盘读取数据到内存,或者把数据写回硬盘的次数。次数越少,电脑处理的就越快。
怎么优化归并排序:
优化就像是你整理书架的时候,想办法让每次拿的书堆更大一些,或者让合并书堆的次数更少一些,这样整理的速度就快了。
败者树是啥:
败者树就像是你在整理书架时,用的一种技巧。每次比较两堆书,把次序不对的那一堆放一边,把对的那一堆继续往上比较,直到找到最小的一堆。
性能分析:
性能分析就是看看你整理书架的技巧好不好,比如比较的次数多不多,整理的深度深不深。
注意点:
归并路数就像是你每次拿书堆的数量,不是拿的越多越好,因为拿太多可能一次拿不完,反而慢了。
进一步优化:
进一步优化就像是你决定减少每次拿的书堆数量,或者增加每次拿的书堆的大小,这样整理书架的速度可能会更快。

置换-选择排序算法
这个算法就像是在玩一个排序游戏。你有一个装满乱序卡片的箱子(FI),一个空的盒子(FO)用来放排好序的卡片,还有一个小托盘(WA)可以放几张卡片。
你从箱子里拿出几张卡片放在托盘上。
然后你找出托盘上最小的那张卡片,把它放到盒子里。
如果箱子里还有卡片,就再拿一张放到托盘上。
接着,你再从托盘上剩下的卡片里找出最小的一张,放到盒子里。
这个过程一直重复,直到托盘上没有卡片了,这时候你就得到了一堆排好序的卡片,也就是一个归并段。
然后你再从箱子里拿卡片,重复上面的步骤,直到箱子空了,所有的卡片都排好序了。
最佳归并树
这个树就像是一个计划表,告诉你怎么把卡片归并起来最省事。
树的每个叶子节点代表一堆已经排好序的卡片。
叶子到根的路径长度表示这堆卡片需要合并几次。
树的根节点代表所有卡片最终合并成的一堆。
算法优化
这里用到了一个叫做哈夫曼树的聪明点子。就是说,先把那些卡片少的堆早点合并,卡片多的堆晚点合并,这样整体上合并的次数就会少,也就是I/O操作次数会减少。
算法修正
如果排好序的卡片堆不够多,不能正好组成一个完美的树,就需要加一些空的卡片堆(虚段),来补足这个树。
这些空的卡片堆应该放在树的最下面,离根节点最远。
通过一些数学计算,我们可以知道需要加多少个空的卡片堆,才能让这个树正好合适。
总的来说,外部排序就是怎么用一种聪明的方法来排序一大堆卡片,让整个过程既快速又省事。
 

知识点链接
外部排序的基本概念:
外部排序是指对那些太大而不能一次性加载到内存中的文件进行排序的过程。
由于文件太大,需要在外存上存储待排序的记录,并通过分批调入内存来进行排序。
外部排序的方法:
文件通常按块存储在磁盘上,操作系统也是按块对磁盘上的信息进行读写。
外部排序的时间代价主要考虑磁盘的访问次数,即I/O次数。
归并排序算法:
归并排序是外部排序中常用的算法,它包括两个阶段:生成归并段和多路归并。
首先,根据内存缓冲区大小,将外存上的文件分成若干长度为f的子文件,然后逐个读入内存并使用内部排序方法进行排序。
排序后的子文件重新写回外存,形成有序的归并段。
接着,对这些归并段进行逐趟归并,直到得到整个有序文件。
耗费时间分析:
外部排序的总时间包括内部排序时间、外存信息读写时间以及内部归并时间。
归并排序优化:
增大归并路数k和减少初始归并段个数r都能减少归并趟数s,从而减少读写磁盘的次数,提高排序速度。
多路平衡归并与败者树:
为了使内部归并不受归并路数k增大的影响,引入了败者树的概念。
败者树是一种树形选择排序的变体,可以视为一棵完全二叉树。
在归并过程中,k个叶结点存放k个归并段当前参与比较的记录,内部结点用来记忆左右子树中的“失败者”,胜者继续向上比较,直到根结点。
性能分析:
败者树的深度和总的比较次数是性能分析的关键因素。
注意:
归并路数k并不是越大越好。增大k值虽然可以减少归并趟数,但会增加输入缓冲区的个数,并且每次从k个归并段中选择最小元素需要进行(k-1)次关键字比较。
优化:
增加归并路数k进行多路平衡归并可以提高排序速度,但需要付出增加输入缓冲区和增加关键字比较次数的代价。
减少初始归并段数量r也是一种优化策略。

置换-选择排序算法(生成初始归并段)
初始设置:有一个待排序的外部文件 FI ,一个用于存放排序结果的输出文件 FO ,以及一个内存工作区 WA 。 WA 可以容纳 w 个记录。
算法实现:
从 FI 文件中读取 w 个记录到内存工作区 WA 。
在 WA 中选择关键字最小的记录,称为 MINIMAX 记录。
将 MINIMAX 记录输出到 FO 文件中。
如果 FI 文件不为空,将下一个记录读入到 WA 中。
在 WA 中,从所有关键字大于 MINIMAX 记录的记录中选择关键字最小的记录,作为新的 MINIMAX 记录。
重复步骤3至5,直到 WA 中无法选出新的 MINIMAX 记录,此时得到一个初始归并段,并输出一个归并段结束的标志到 FO 。
重复步骤2至6,直到 WA 为空,这样可以得到全部的初始归并段。
最佳归并树
结构概述:最佳归并树是一种用于优化外部排序的数据结构。树的每个叶节点代表一个初始归并段,叶节点的权值表示该归并段的长度。从叶节点到根节点的路径长度表示该归并段参与归并的次数。非叶节点代表归并后形成的新归并段,根节点代表最终生成的归并段。归并树的带权路径长度(WPL)表示归并过程中的总读记录数。
算法优化
哈夫曼树思想:通过引入哈夫曼树的概念,可以优化归并树的构建。在归并树中,记录数较少的初始归并段应尽早归并,记录数较多的初始归并段应尽可能晚归并,从而建立总I/O次数最少的最佳归并树。
算法修正
当初始归并段的数量不足以构成一棵严格的k叉树时,需要添加长度为0的“虚段”来满足树的结构要求。
根据哈夫曼树的原则,权值为0的叶子节点应尽可能远离树根。
需要修正的条件
如果度为0的节点有 u 个,度为k的节点有 v 个,严格k叉树需要满足的条件是: ku = v + 1 变形可得: u = \frac{v + 1}{k} 这表明可以正好构造k叉归并树。
为了建立归并树,可能需要添加 k-u-1 个空归并段。
这个算法和数据结构的描述提供了一种有效的外部排序方法,尤其是在处理大量数据时,可以显著减少I/O操作的次数,提高排序效率。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值