408复习-数据结构-外部排序

学习目标:

了解外部排序

  • 外部排序概念
  • 外部排序方法
  • 败者树
  • 多路平衡归并

学习内容:

外部排序概念

在进行大文件排序时候,文件中记录很多,无法将整个文件复制到内存中进行排序,需要将待排序记录存在外存上,再把数据一部分一部分调入内容中进行排序,在此期间,需要进行多次内外存数据交换。

外部排序方法

1.采用归并排序算法思路
2.包括两个阶段:
一,根据内存缓冲区大小,将外存文件内容划分成若干长度为相同的子文件

二,对这些文件进行逐趟归并排序,直到完全有序
在这里插入图片描述

在这里插入图片描述
外部排序的总时间= 内部排序所需的时间 + 外存信息读写的时间 + 内部归并所需的时间
r 个归并段经过k路可以归并成为⌈r/k⌉个归并段
树的高度h -1 = ⌈ log ⁡ k r \log_k^r logkr
可见,只要增大归并路数妇或减少初始归并段
个数r,都能减少归并趟数S,进而减少读写磁盘的次数,达到提高外部排序速度的目的。

败者树

S趟归并总共需要的比较次数为
S(n-1)(k-1) = ⌈ log ⁡ k r \log_k^r logkr⌉ (n - 1 )(4 - 1)/⌈ log ⁡ 2 k \log_2^k log2k

引入败者树是为了减少比较次数
在这里插入图片描述
因为k路归并的败者树深度为 ⌈ log ⁡ 2 k \log_2^k log2k⌉ ,因此k个记录中选择最小关键字,最多需要⌈ log ⁡ 2 k \log_2^k log2k⌉次
比较。所以总的比较次数为
s(n - 1)⌈ log ⁡ 2 k \log_2^k log2k⌉ =⌈ log ⁡ k r \log_k^r logkr⌉(n-1)⌈ log ⁡ 2 k \log_2^k log2k⌉ = (n-1)⌈ log ⁡ 2 r \log_2^r log2r
1.可见,使用败者树后,内部归并的比较次数与k无关了
2.归并路数左并不是越大越好。归并路数左增大时,相应地需要增加输入缓 冲区的个数。

置换-选择排序

减少初始归并段个数r也可以减少归并趟数s。
在这里插入图片描述

最佳归并树

文件经过置换-选择排序后,得到的是长度不等的初始归并段。
当归并顺序与哈夫曼树结构一致时可以使得磁盘I/O次数最少。
例如:在初始化后的各个归并段的长度分别为[为9, 30, 12, 18,3, 17,2,6,24],归并路线为3路
1.使用随机归并顺序
在这里插入图片描述
树的带权路径长度WPL为归并过程中的总读记录数,故I/O次数=2xWPL = 484。
2.使用哈夫曼树思想
在这里插入图片描述
每次选取最小的3个段组成一个新段。按此树进行归并,故I/O次数=2xWPL = 4446次读/写,这棵归并树便称为最佳归并树。
当初始归并段的数量不满足可以构成严格的三叉树就要添加几个虚段(权值为0)。

1.假设以k路归并,总归并段为n0
2.在树中只有度为0和度为k的节点

nk+n0=n	 //度为k的加度为0的个数为n
k*nk=n-1 //所有分支都连接一个节点,只有根节点没有

最后推出 nk=(n0-1)/(k-1)----->(n0-1)%(k-1)==0
需要补充(k-1)-[(n0-1)%(k-1)]个虚段

总结

·外部排序
在这里插入图片描述
·败者树
在这里插入图片描述
·最佳归并树
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mystic Musings

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

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

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

打赏作者

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

抵扣说明:

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

余额充值