408数据结构学习笔记——外部排序
目录
1.外部排序的基本概念
2.外部排序
2.1.外部排序的思想
2.2.外部排序的开销
2.3.优化——多路归并
3.败者树
4.置换选择排序
4.1.算法思想
4.2.手算过程
5.最佳归并树
1.外部排序的基本概念
外存中的数据读入内存→在内存中排序→数据写入外存
2.外部排序
2.1.外部排序的思想
采用归并排序的思想和方法
1.数据初始状态
2.将(36、8、26)(42、9、48)分别存入输入缓冲区1、输入缓冲区2
3.将输入缓冲区1和输入缓冲区2的数据进行递增排序
4.将输入缓冲区1和输入缓冲区2的数据通过输出缓冲区逐一写入外存,形成一个有序归并段
5.将(1、37、25)(45、27、28)分别存入输入缓冲区1、输入缓冲区2
6.将输入缓冲区1和输入缓冲区2的数据进行递增排序
7.将输入缓冲区1和输入缓冲区2的数据通过输出缓冲区逐一写入外存,形成一个有序归并段
8.对剩余12块内存依次进行上述操作,总共需要进行16次读操作和16次写操作,得到初始归并段
9.第一次归并:读入归并段1和归并段2中的第一块磁盘(相对最小),进行排序
10.依次找出这两个输入缓冲区中最元素,并将其移动到输出缓冲区中,当输出缓冲区满,则写入外存(1、8、9)
11.继续找出这剩余元素中的最小元素,直到某一个缓冲区中空,则读入其所属归并段的后一个内存块的数据,并继续进行上述操作。直到两个缓冲区都空,且归并段1和归并段2中的元素全部读入内存,此时归并段1和归并段2就得到了一个有序的递增序列
输入缓冲区1空
输入归并段1的第二块内存
排序完成,归并段1和归并段2递增有序
12.对剩余的六个归并段进行上述操作,八个归并段→四个归并段
13.第二次归并:继续采用此方法依次取出归并段1和归并段2(归并段1为八个归并段时的归并段1和归并段2,归并段2为八个归并段时的归并段3和归并段4)的各个块进行排序操作(步骤9、10、11)→四个归并段→两个归并段
原归并段1、2排序形成归并段1
原归并段3、4排序形成归并段2
14.第三次归并:继续排序归并段1、2,形成最后的有序递增序列
2.2.外部排序的开销
上述外部排序中:形成初始归并段→第一次归并(8 ~ 4)→第二次归并(4 ~ 2)→第三次归并(2 ~ 1)(每个过程都需要读和写16次,共32 + 32 * 3 = 128次)
总时间开销 = 内部排序所需时间 + 内部归并所需时间 + 外部读写所需时间
2.3.优化——多路归并
改用四路归并:初始化归并段→第一次归并(8 ~ 2)→第二次归并(2 ~ 1)
需要读写次数:32 + 32 * 2 = 96
但是,与此同时,缓冲区的数量也要变成四个(k路归并需k个缓冲区)
结论:1.对于 r 个初始归并段进行 k 路归并,需要归并趟数 = (向上取整,归并树高度)
2.提升外部排序的速度、减少读写磁盘的速度的方法:提高 k 值,降低 r 值。
提高 r 值:增加归并段长度
但是,提高 k 有负面影响:
A.需要的缓存空间升高(k路归并需k个缓冲区)
B.内部归并的所需时间提高(选出最小关键字需要进行k - 1次比较)
3.败者树
视为一棵完全二叉树
1.将每个归并段的第一个元素作为叶子结点加入败者树中
2.从左至右、从上往下的更新分支节点的信息:判断其左右子树的大小,除了根节点(最上面那个结点)记录冠军来自哪个归并段外,其余各分支节点记录的是失败者来自哪个归并段
3.取出最小的元素1后,从其所属的归并段中取出下一个元素6,依次与从叶子结点到根节点的各个结点所记录的败者信息进行对比
引进败者树后,选出最小的关键字,仅需log2k次比较(向上取整)
4.置换选择排序
4.1.算法思想
使用选择置换排序,可以让每个初始段的长度不再受限于内存工作区大小
设内存工作区最多容纳w个数据
①将待排序文件FI输入w个数据到内存工作区WA中
②选择WA中关键字最小的数据,输出到FO中,并且用MIN记录该最小关键字
③若FI不空,则从FI中继续输入文件到WA
④ 从WA中选出比MIN更大的关键字的数据,输出并更新此最小关键字作为新MIN
⑤重复②~④直到WA中的每个关键字都>MIN为止,由此得到一个新的归并段
⑥重复②~⑤,直到WA空,得到全部初始归并段
4.2.手算过程
1.初始状态
归并段1:
2.4、6、9依次加入内存工作区中,(4、6、9)选择最小的元素4,输出4并更改MIN = 4
3.加入7,(7、6、9)选择最小元素6 > MIN = 4,输出6并更改MIN = 6
4.加入13,(7、13、9)选择最小元素7 > MIN = 6,输出7并更改MIN = 7
5.加入11,(11、13、9)选择最小元素9 > MIN = 7,输出9并更改MIN = 9
6.加入16,(11、13、16)选择最小元素11 > MIN = 9,输出11并更改MIN = 11
8.加入14,(14、13、16)选择最小元素13 > MIN = 11,输出13并更改MIN = 13
9.加入10,(14、10、16)选择最小元素10 < MIN = 13,标记13为不可输出,选择第二小的元素14 > MIN = 13,输出14并更改MIN = 14
10.加入22,(22、10、16)选择最小元素16 > MIN = 14,输出16并更改MIN = 16
11.加入30,(22、10、30)选择最小元素22 > MIN = 16,输出并更改MIN = 22
12.加入2,(2、10、30)选择最小元素2 < MIN = 22,标记2为不可输出,选择第三小的元素30 > MIN = 22,输出30并更改MIN = 30
13.加入3,(2、10、3)选择最小元素3 < MIN = 30,标记2为不可输出,此时,输出缓冲区中的三个元素都是不可输出元素,则第一个归并区到上一个输出元素为止(4、6、7、9、11、13、14、16、22、30)
归并段2:
14.(2、10、3)选择最小元素2,输出2并更改MIN = 2
15.加入19,(19、10、3)选择最小元素3 > MIN = 2,输出3并更改MIN = 3
16.加入20,(19、10、20)选择最小元素10 > MIN = 3,输出10并更改MIN = 10
17.加入17,(19、17、20)选择最小元素17 > MIN = 10,输出17并更改MIN = 17
18.加入1,(19、1、20)选择最小元素1 < MIN = 17,标记1为不可输出,选择第二小的元素19 > MIN = 17,输出19并更改MIN = 19
19.加入23,(23、1、20)选择最小元素20 > MIN = 19,输出20并更改MIN = 20
20.加入5,(23、1、5)选择最小元素5 < MIN = 20,标记5为不可输出,选择第三小的元素23 > MIN = 23,输出23并更改MIN = 23
21.加入36,(36、1、5)选择最小元素36 > MIN = 36,输出36并更改MIN = 36
22.加入22,(12、1、5)选择最小元素12 < MIN = 36,标记12为不可输出时,输出缓冲区中的三个元素都是不可输出元素,则第二个归并区到上一个输出元素为止(2、3、10、17、19、20、23、36)
第三个归并段:
23.(12、1、5)选择最小元素1,输出1并更改MIN = 1
24.加入18,(12、18、5)选择最小元素5 > MIN = 1,输出5并更改MIN = 5
25.加入21,(12、18、21)选择最小元素12 > MIN = 5,输出12并更改MIN = 12
26.加入39,此时,待排序文件空,将内存工作区中的剩余数据按序输出,即18、21、39,则第三个归并段为(1、5、12、18、21、39)
5.最佳归并树
1.性质和构造完全相同于哈弗曼树
2.与哈弗曼树的区别:
k叉树,其中k > 2时:需要判断是否能满足构造完全k叉树,若不满足,则需要添加长度为0的“虚段”
①若(初始归并段数量 - 1) % (k - 1) = 0,则能构成完全k叉树
②若(初始归并段数量 - 1) % (k - 1)= u ≠ 0,则说明需要添加(k - 1)- u 个虚段才能构成完全二叉树
408数据结构学习笔记——外部排序相关推荐
- 数据结构学习笔记——基数排序 | 排序算法总结
目录 一.基数排序排序思想 二.基数排序算法分析 三.排序算法总结 (一)分类 (二)比较 (三)详细分析 一.基数排序排序思想 基数排序与前面的排序算法不一样,它不基于比较和移动元素来进行排序,而是 ...
- 408数据结构学习笔记——二叉排序树、二叉平衡树、红黑树
目录 1.二叉排序树 1.1.二叉排序树的基本概念 1.2.二叉排序树的查找代码实现 1.3.二叉排序树的插入 1.4.二叉排序树的删除 1.5.二叉排序树的查找效率 1.6.二叉排序树的缺陷 2.平 ...
- 408数据结构学习笔记-树-①树的逻辑结构
目录 ①定义 ②结点间的关系描述 ③结点路径 ④结点,树的属性描述 ⑤有序树和无序树 ⑥森林 ⑦树的性质(6个性质) a.结点数=总度数+1 b.度为m的树和m叉树的区别 c.度为m的树第i层至多有 ...
- 408数据结构学习笔记——顺序查找、折半查找、分块查找
目录 1.顺序查找 1.1.顺序查找的概念 1.2.顺序查找的代码 1.3.顺序查找的查找效率 1.4.顺序查找的优化 1.5.顺序表的时间复杂度 2.折半查找 2.1.折半查找的概念 2.2.折半查 ...
- 408数据结构学习笔记——栈和队列的应用、特殊矩阵的压缩
目录 1.栈在括号匹配中的应用 2.栈在表达式求值中的运用 2.1.中缀表达式转换后缀表达式 2.2.后缀表达式的计算方法 2.3.中缀表达式转换前缀表达式 2.4. 中缀表达式转后缀表达式(机算- ...
- 数据结构学习笔记(王道)
数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录 数据结构学习笔记(王道) 一.绪论 1.1. 数据结构 1.2. 算法 1.2.1. 算法的基本概念 1.2.2. ...
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
- Python数据结构学习笔记——栈
目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...
- 数据结构学习笔记之快速排序(非递归)
数据结构学习笔记之快速排序(非递归) 代码如下: #include<assert.h> #include<memory.h> //快速排序(升序) void QuickSort ...
最新文章
- 9款超赞的AI开源项目!| 本周Github精选
- vue 编译警告 Compiled with 4 warnings
- Android中文API(115)——AudioFormat
- 新的一年,开始新的学习旅途
- 标签的属性和样式属性有什么区别
- Java集合中HashMap日常问题及解决办法
- 学习:java设计模式—工厂模式
- 【共读Primer】55.[6.4]函数重载--重载与作用域 Page210
- figma设计_一种在Figma中跟踪设计迭代的简单方法
- html调用js页面显示不出来了,JS代码文件调用显示乱码,直接写在html页面的里可以调用,但是单独放在js文件里不能调用...
- C#操作类----XmlHelper
- ASP.NET域集成AD身份验证
- 电视ping功能测试软件,PingMon(超级Ping监测工具)
- J2EE框架技术(SpringMVC) 知识点笔记(2)
- Qt对图像的二值化处理
- Git 基础之远程仓库-2.5
- 数学英语计算机拼音,幼儿英语拼音数学早教机
- 【杂谈】MacPro 2015款拆机清灰换导热硅脂实录
- 是官方的-FeedDemon是炸弹
- VBA金融建模——期权定价
热门文章
- 股市中的牛市和熊市是什么意思?股票里的牛市和熊市是什么意思
- “中银杯”辽宁省第十九届职业院校技能大赛软件测试赛项
- php勋章,phpwind v8.7 勋章体系2.0
- 对Activity生命周期的理解
- web前端面试题最全版总结
- oracle 管理入门笔记
- mysql dba 兼职_招聘兼职数据共享与交换平台| - 实现网
- 解读谷歌Pathways架构(一):Single-controller与Multi-controller
- 人教版 初步使用计算机 教案,人教版信息技术六年级上册教案
- 张高兴的 Xamarin.Forms 开发笔记:Android 快捷方式 Shortcut 应用