排序:外部排序算法分析

1.外存与内存之间的数据交换

1.外存(磁盘)

操作系统以"块"为单位对磁盘存储空间进行管理,如:每块大小1KB

各个磁盘块内存放着各种各样的数据。

2.内存

磁盘的读/写以"块"为单位数据读入内存后才能被修改修改完了还要写回磁盘。

2.外部排序的原理

外部排序:数据元素太多,无法一次全部读入内存进行排序。

使用"归并排序"的方法,最少只需在内存中分配3块大小的缓冲区即可对任意一个大文件进行排序。

1.步骤
  1. 生成r个初始归并段(对L个记录进行内部排序,组成一个有序的初始归并段)
  2. 进行S趟k路归并, s = l o g k r s= log_kr s=logkr
2.构造初始归并段

"归并排序"要求各个子序列有序,每次读入两个块的内容,进行内部排序后写回磁盘。

3.进行k路归并
  1. 把k个归并段的块读入k个输入缓冲区
  2. 用"归并排序"的方法从k个归并段中选出几个最小记录暂存到输出缓冲区中
  3. 当输出缓冲区满时,写出外存
3.时间开销分析

外部排序时间开销=读写外存的时间+内部排序所需时间+内部归并所需时间。

3.影响外部排序效率的因素

主要因素是磁盘IO的读写次数。

4.优化思路

k路平衡归并:

  • ①最多只能有k个段归并为一个;
  • ②每一趟归并中,若有m 个归并段参与归并,则经过这一趟处理得到m/k个新的归并段
1.增加归并路数k,进行多路平衡归并
  • 重要结论:采用多路归并可以减少归并趟数,从而减少磁盘IO(读写)次数。
  • 对r个初始归并段,做k路归并,则归并树可用k叉树表示
  • 若树高为h,则归并趟数= h − 1 = l o g k r h-1 = log_kr h−1=logkr,
  • k越大,r越小,归并趟数越少,读写磁由次数钺小.

推导:k叉树第h层最多有 k h − 1 k^{h-1} kh−1个结点,则 r ≤ k h − 1 r ≤k^{h-1} r≤kh−1, ( h − 1 ) 最小 = 「 l o g k r (h-1)最小= 「log_kr (h−1)最小=「logkr

2.多路归并带来的负面影响:
  • ①k路归并时,需要开辟k个输入缓冲区,内存开销增加。
  • ②每挑选一个关键字需要对比关键字(k-1)次,内部归并所需时间增加(可以使用败者树减少对比次数)
3.减少初始归并段数量

结论:若能增加初始归并段的长度,则可减少初始归并段数量r。

可用"置换-选择排序"进一步减少初始归并段数量。

相关推荐
ZhouDevin39 分钟前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
Tim_101 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
船厂电气自动化ai大模型2 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳2 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了6662 小时前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法
靠沿3 小时前
贪心算法专题(三)
算法·贪心算法
super大力张3 小时前
MOE基于结构的药物设计(七):Ligand R-Vectors——如何判断配体可以从哪里继续生长?
数据库·算法·cadd·moe·svl·基于结构的药物设计
Tongsr4 小时前
别只混淆代码:用 Kaleido 加固整个 Android Release AAB
前端·算法·github
高亦真4 小时前
今天是学习嵌入式的第34天
linux·学习·算法
飞Link5 小时前
动作方法中的分割与过度分割方法全解析(含代码实战与踩坑案例)
人工智能·python·算法·计算机视觉