当前位置: 首页 > news >正文

8.【外部排序】基本概念和方法 + 优化:【败者树】{减少关键字对比次数}、【置换-选择 排序】{减少初始归并段数量}、【最佳归并树】{谁先合并更快}

文章目录

  • 外部排序的基本概念和方法
    • 1. 外部排序的步骤
    • 2. `外部排序时间开销` = **读写外存的时间 + 内部排序所需时间+内部归并所需时间**
    • 3. 优化
    • 4. 纠正:什么是多路平衡归并?
  • 败者树【减少关键字对比次数】
  • 置换-选择 排序【减少初始归并段数量】
  • 最佳归并树【解决:归并段谁和谁合并更快?】

外部排序的基本概念和方法

外部排序:对大文件进行排序时,因为文件中的记录很多、信息量庞大,无法将整个文件复制进内存中进行排序。
因此需要将待排序的记录存储在外存上,排序时再把数据一部分一部分地调入内存进行排序,在排序过程中需要多次进行内存和外存之间的交换。

1. 外部排序的步骤

① 根据内存缓冲区大小,将外存上的文件分成 r 个子文件,依次读入内存并利用内部排序方法对它们进行排序,并将排序后得到的有序子文件重新写回外存【目的:形成一个归并段,共r个归并段】。
在这里插入图片描述
 
② 对这r个有序归并段进行 S 趟 k 路归并,使归并段(有序子文件)逐渐由小到大,直至得到整个有序文件为止,其中 S=⌈logk​r⌉。(需要在内存中分配k个输入缓冲区和1个输出缓冲区)

注:如何进行 k 路归并?
① 把【k个归并段的块】读入【k个输入缓冲区】。
② 用“归并排序”的方法,从k个归并段中,选出几个最小记录暂存到输出缓冲区中。
③ 当输出缓冲区满时,写出外存。

就是归并排序的过程,只不过有空间的限制



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



3. 优化

①增加归并路数k【就是k合一】,但是需要增加相应的输入缓冲区,且每次从k个归并段中,选出一个最小元素需要对比 (k-1) 次。
②减少初始归并段数量r。


4. 纠正:什么是多路平衡归并?

在这里插入图片描述
例子:在这里插入图片描述



败者树【减少关键字对比次数】

败者树解决的问题:
从 k 个归并段选出一个最小元素需要对比关键字 (k-1) 次,而构造败者树可以使关键字对比次数减少到⌈ log2 k ⌉

过程:
初始8个有序归并段
在这里插入图片描述
找出第一个最小的:
在这里插入图片描述
在这里插入图片描述
故第一次找出最小的是段3,值为1
随后把值为1的结点去掉,用段3的下一个代替,更新败者树,等到下一个最小为段5,值为2【总共对比了3次——log2 8】
在这里插入图片描述
随后把值为2的结点去掉,用段5的下一个代替,以此重复进行

败者树的实现思路:

在这里插入图片描述
例子:
在这里插入图片描述



置换-选择 排序【减少初始归并段数量】

产生更长的初始归并段,从而减少初始归并段数量

初始
在这里插入图片描述
过程:
在这里插入图片描述
在这里插入图片描述

当集满3个红色,开始归并段2
在这里插入图片描述

如果是原始的话,需24/3=8个归并段



最佳归并树【解决:归并段谁和谁合并更快?】

在这里插入图片描述
在这里插入图片描述
构造2路归并的最佳归并树:
在这里插入图片描述

多路归并的最佳归并树:

在这里插入图片描述

如果减少⼀个归并段:

在这里插入图片描述
添加虚段的数量:
在这里插入图片描述

相关文章:

  • Python装饰器通俗理解
  • 1516. 移动 N 叉树的子树 DFS
  • 【计算机图形学】高级外观建模
  • 阿里云dataworks中业务流程中问题(odps2)
  • 数据库基础小练习
  • java计算机毕业设计基于安卓Android/微信小程序的汽车租赁小程序-app
  • 学习-Java类和对象之访问限制
  • MATLAB2016笔记(十一):基本粒子群优化算法(PSO)的MATLAB实现
  • MyBatisPlus总结
  • 14天刷爆LeetCode算法学习计划——Day02双指针(2)
  • 《数据结构》时间复杂度
  • Redis 3 - 集群
  • HTTPS优化——协议优化,证书优化,会话复用
  • sqlplus rlwrap: error: Cannot execute sqlplus: Too many levels of symbolic lin
  • 【36C++STL-常用容器----3、stack容器详解】
  • 【知识碎片】第三方登录弹窗效果
  • Android开源项目规范总结
  • Angular4 模板式表单用法以及验证
  • CentOS 7 防火墙操作
  • Effective Java 笔记(一)
  • Java方法详解
  • js正则,这点儿就够用了
  • log4j2输出到kafka
  • OSS Web直传 (文件图片)
  • SOFAMosn配置模型
  • Webpack 4 学习01(基础配置)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 收藏好这篇,别再只说“数据劫持”了
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • Linux权限管理(week1_day5)--技术流ken
  • 阿里云服务器如何修改远程端口?
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​configparser --- 配置文件解析器​
  • ​业务双活的数据切换思路设计(下)
  • #ifdef 的技巧用法
  • #pragma pack(1)
  • $L^p$ 调和函数恒为零
  • (13):Silverlight 2 数据与通信之WebRequest
  • (三)模仿学习-Action数据的模仿
  • ***测试-HTTP方法
  • .cfg\.dat\.mak(持续补充)
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET基础篇——反射的奥妙
  • .NET序列化 serializable,反序列化
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Bean有哪些属性
  • @Resource和@Autowired的区别
  • [ C++ ] STL---string类的模拟实现
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [android] 切换界面的通用处理
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [dart学习]第四篇:函数
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [GN] DP学习笔记板子