【背诵笔记】外部排序

外部排序是一种处理大量数据的排序算法,通过归并排序和磁盘操作完成。文章介绍了如何构建初始归并段,执行多路归并,并利用败者树减少比较次数。同时,提出了置换选择排序来优化初始归并段的数量,以减少I/O操作。此外,讨论了最佳归并树的概念,特别是如何构建二路和多路归并树以最小化IO次数。
摘要由CSDN通过智能技术生成

外部排序

在这里插入图片描述

在这里插入图片描述

原理

1,通过归并排序执行
在这里插入图片描述
2,构造初始归并段
分批次将磁盘中的两个块读入内存中,进行内部排序,
在这里插入图片描述
然后写回磁盘,合成一个包含两个小块的初始归并段
在这里插入图片描述

在这里插入图片描述
3,第一趟归并
对两个有序初始归并段执行归并
在这里插入图片描述
分别读取两者中较小的块到内存执行排序,然后输出到磁盘
在这里插入图片描述
一旦有缓冲区空了就从对应的初始归并段补充数据
在这里插入图片描述
最后归并为一个更长的归并段
在这里插入图片描述
4,第二趟归并
和第一趟归并思路一样,只是序列更长
在这里插入图片描述
在这里插入图片描述

时间开销

排序时间等于读写内外存时间和内部排序时间
在这里插入图片描述
1,优化:多路归并

在这里插入图片描述
可以减少归并趟数,减少读写次数
在这里插入图片描述
2,优化,减少初始归并段数量(构建更长的序列)
在这里插入图片描述
在这里插入图片描述

败者树

原理

多路归并会增加关键字对比的次数,增加内部归并排序时间。
在这里插入图片描述
1,先由n个节点进行对比,结果存在树中非叶节点,根节点为冠军,冠军自动退出。
在这里插入图片描述
2,由新节点替代冠军在叶节点的位置,重新进行对比,只需和自己这一边的树上对比即可。对比次数减少
在这里插入图片描述
在这里插入图片描述

应用

根节点记录冠军
非叶节点记录失败者
叶节点对应归并段
在这里插入图片描述
第一次构建对比k-1次
在这里插入图片描述
此后基于败者树,只需logk次
在这里插入图片描述

在这里插入图片描述

置换选择排序

通过置换选择排序可以减少初始归并段数量
之前的算法中,受到内存工作区限制,初始归并段较短,数量较多,增加了IO次数
在这里插入图片描述
可以直接增加内存,提升初始归并段长度
在这里插入图片描述

思路

每次都将内存中的最小元素置换出去。
在这里插入图片描述
然后从外存中读取一个元素补充到内存中,然后将内存中最小元素与初始归并段最后一个(最大)元素对比,如果比初始归并段最后一个元素大,就可以继续置换
在这里插入图片描述
如果内存中最小元素小于大于初始归并段中最大元素,则标记该元素,然后选择内存中其他元素对比,继续置换
在这里插入图片描述
如果内存中所有元素都比初始归并段最后一个元素小,则该归并段在此截止,执行构建第二个归并段。

在这里插入图片描述
直到待排序列都归并到初始归并段为止。置换选择排序可以使得初始归并段突破内存大小的限制。
在这里插入图片描述

在这里插入图片描述

最佳归并树

在这里插入图片描述

二路归并

在归并过程中,IO次数等于归并树的带权路径长度
在这里插入图片描述
WPL计算,叶子节点的权值乘以路径长度。
在这里插入图片描述
构造哈夫曼树即可实现最小带权路径长度,从而减少IO次数
在这里插入图片描述

多路归并

在这里插入图片描述

对k路归并,要保证构建严格的k叉树,如果节点数量不够,则应该添加权值为0的节点。
在这里插入图片描述

从初始归并段中选择权值最小的3个构建归并树,然后将孩子节点加入序列中继续构建归并树。
在这里插入图片描述
在这里插入图片描述
其实这个也不用记,直接在草稿纸画一下草图,一看缺几个就补上几个,然后构建哈夫曼树

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕南路GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值