外部排序

外部排序:由于计算机内存有限,当数据量过大时,数据不能一次性加载到内存中,数据保存在外存中(硬盘,文件里面)上,(寄存器>Cache>内存>固态硬盘>机械硬盘),限制外部排序效率的是IO(读写)的效率。如果要提高外部排序的效率,就要减少IO次数。

一般来说外排序分为两个步骤:预处理和合并排序。首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长度为t的子文件(或段);其次,利用内部排序的方法,对每个子文件的t个纪录进行内部排序。这些经过排序的子文件(段)通常称为顺串(run),顺串生成后即将其写入外存。这样在外存上就得到了m个顺串(m=[n/t])。最后,对这些顺串进行归并,使顺串的长度逐渐增大,直到所有的待排序的记录成为一个顺串为止。

思路:


上面的是4路归并

(1) 二路合并排序
二路合并是最简单的合并方法,合并的实现与内排序中的二路归并算法并无本质区别,下面通过具体例子,分析二路合并外部排序的过程。

有一个含有9000个纪录的文件需要排序(基于关键字)。假定系统仅能提供容纳1800个纪录的内存。文件在外存(如磁盘)上分块存储,每块600个纪录。外部排序的过程分为生成初始顺串和对顺串进行归并排序两个阶段。在生成初始顺串阶段,每次读入1800个纪录(即3段)待内存,采用内排序依次生成顺串依次写入外存储器中。

顺串生成后,就开一开始对顺串进行归并。首先将内存等分成3个缓冲区,每个缓冲区可容纳600个纪录,其中两个为输入缓冲区,一个为输出缓冲区,每次从外存读入待归并的块到输入缓冲取,进行内部归并,归并后的结果送入输出缓冲区,输出缓冲区的记录写满时再将其写入外存。若输入缓冲区中的纪录为空,则将待归并顺串中的后续块读入输入缓冲区中进行归并,直到待归并的两个顺串都已归并为止。重复上述的归并方法,由含有5块(每块上限1800个记录)的顺串经二路归并的一遍归并后生成含有3块(每块上限3600个记录)的顺串,再经过第二遍……第s遍(s=[],m为初始顺串的个数),生成含有所有记录的顺串,从而完成了二路归并外部排序。

对文件进行外部排序的过程中,因为对外存的读写操作所用的操作的时间远远超过在内存中产生顺串和合并所需的时间,所以常用对外存的读写操作所用的时间作为外部排序的主要时间开销。分析一下上述二路归并排序的对外存的读写时间。初始时生成5个顺串的读写次数为30次(每块的读写次数为2次)。
类似地,可得到二路、三路……多路合并方法。

(2) 多路替代选择合并排序

采用多路合并技术,可以减少合并遍数,从而减少块读写次数,加快排序速度。但路数的多少依赖于内存容量的限制。此外,多路合并排序的快慢还依赖于内部归并算法的快慢。

设文件有n个纪录,m个初始顺串,采用k路合并方法,那么合并阶段将进行遍合并。k路合并的基本操作是从k个顺换的第一个纪录中选出最小纪录(即关键字最小的纪录),把它从输入缓冲区移入输出缓冲区。若采用直接选择方式选择最小元,需要k-1次比较,遍合并共需n(k-1)=次比较。由于随k的增长而增长,则内部归并时间亦随k的增大而增大,这将抵消由于增大k而减少外存信息读写时间所得的效果。若在k个纪录中采用树形选择方式选择最小元,则选择输出一个最小元之后,只需从某叶到根的路径上重新调整选择树,即可选择下一个最小元。重新构造选择书仅用O()次比较,于是内部合并时间O(n)=O(),它与k无关,不再随k的增大而增大。

m路归并
外部排序读写的次数与归并的趟数成正比
每归并一趟,把所有的数据加载进来,并且写回来
总共进行多少趟归并 log(m) n/k   logm r
n总的数据个数
k每个内存块中数据存储的个数
n/k ==  数据块  初始归并段的数量  r

提高外部排序的效率:
1.多路归并 增加归并路数
多路归并时,为了减少比较次数
败者树 选取最小值只需要logm次比较
2.减少初始归并段
增加每个归并段的数据量(内存变大)
置换选择排序 来初始化归并段

最佳归并树用置换-选择排序 初始化的每个归并段中数据的个数不一样用这些归并段来构造一个m叉树,要使得读写次数最少需要构造一棵最优m叉树,最佳归并树和哈夫曼树差不多
9个归并段:9,30,12,18,3,17,2,6,24(9+30+12+18+3+17+2+6+24)*2 = 4849,12,18,3,17,2,6,24
为了构造m叉最佳归并树,可能需要增加虚段(0)
9,12,18,3,17,2,6,24  构成三叉最优归并树
9,12,18,3,17,2,6,24 ,0假设对m个归并段,进行k路归并,使读写次数最少 得构造最优归并树
需要补充多少个虚段?9个归并段  3路归并
8个归并段  3路归并   1个虚段
7个归并段  3路归并
10个归并段 4路归并
11个归并段 4路归并
(m-1)%(k-1) == 0  不需要补充虚段m叶子结点个数  除了叶子结点以外,所有n结点需要k个子结点n个度为k的结点  m个度为0的结点结点个数=总度数+1
nk+1=n+m
(k-1)n = m-1  n肯定是整数
n = (m-1)/(k-1)  (m-1)%(k-1)为0需要补:k-(m-1)%(k-1)-1个虚段k-1 - (m-1)%(k-1)       x/y != 0x%y 余数(x-x%y+y)%y == 0(x+(y-x%y))%y == 0外部排序的二路归并思路
影响外部排序效率的因素
提高外部排序的效率 减少归并的趟数(增加归并路数 减少初始归并段的数量)
增加归并路数:

败者树 (减少比较次数)

败者树是计算机科学学科里的一种数据结构,可用于外部排序中提高效率。败者树实际上是一棵完全二叉树,可以看做是胜者树的一种变体。败者树简化了重构。败者树的重构只是与该结点的父结点的记录有关,而胜者树的重构还与该结点的兄弟结点有关。败者树中每个叶节点存放各归并段在归并过程中当前参加比较的记录,每个非叶结点记忆其两个子女结点中记录排序码小的结点(即败者)。
败者树
败者树

注意,败者树的重构跟胜者树是不一样的,败者树的重构只需要与其父结点比较。对照右图来看,b3与结点ls[4]的原值比较,ls[4]中存放的原值是结点4,即b3与b4比较,b3负b4胜,则修改ls[4]的值为结点3。同理,以此类推,沿着根结点不断比赛,直至结束。
败者树重构过程如下:
将新进入选择树的结点与其父结点进行比赛:将败者存放在父结点中;而胜者再与上一级的父结点比较。
比赛沿着到根结点的路径不断进行,直到ls[1]处。把败者存放在结点ls[1]中,胜者存放在ls[0]中。

转换选择排序:得到初始归并段(每个归并段是有序的)
最佳归并树:根据初始归并段构造最佳归并树,减少读写磁盘次数

数据结构---外部排序相关推荐

  1. 11-1-败者树-外部排序-第11章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第11章  外部排序 - 败者树 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...

  2. 数据结构 | 【排序】外部排序

    零.核心部分 1. 实现外部排序的两个过程: 将整个初始文件分为多个初始归并段; 将初始归并段进行归并,直至得到一个有序的完整文件: 2. 时间组成: 内部排序所需要的时间 外存信息读写所需要的时间  ...

  3. 数据结构之外部排序:最佳归并树

    外部排序:最佳归并树 思维导图: 归并树的定义: 例: 最佳归并树(本质是一颗哈夫曼树): 所有的初始归并段一定能构造出一颗完美的哈夫曼树吗? 怎么选择补充虚短的个数? 思维导图: 归并树的定义: 例 ...

  4. 数据结构之外部排序:置换-选择排序

    外部排序:置换-选择排序 置换-选择排序算法思想: 步骤: 通过减少归并段r来减少IO次数 置换-选择排序算法思想: minimax就是FO中的最后一个数据元素的大小 1.将工作区填满 2.从工作区选 ...

  5. 数据结构之外部排序:失败树

    外部排序:失败树 S趟归并总共需要比较的次数1: 失败树的定义: S趟归并总共需要比较的次数2: 总结: 通过失败树来增加归并排序路数从而减少io读写次数 S趟归并总共需要比较的次数1: S是趟数,n ...

  6. 数据结构之外部排序:归并排序法

    外部排序:归并排序法 思维导图: 外部归并排序的原理: 外部归并排序的性能: 归并排序法的优化: 思维导图: 外部归并排序的原理: 第一步: 第二步: 问题:内存缓存区大小固定,外存数据元素分块后仍然 ...

  7. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  8. 408数据结构学习笔记——外部排序

    目录 1.外部排序的基本概念 2.外部排序 2.1.外部排序的思想 2.2.外部排序的开销 2.3.优化--多路归并 3.败者树 4.置换选择排序 4.1.算法思想 4.2.手算过程 5.最佳归并树 ...

  9. 数据结构---归并排序和外部排序

    内部排序 若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序. 外部排序 若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序. 就地排序 若排序算 ...

最新文章

  1. [IIS]修改MaxFieldLength与MaxRequestBytes彻底解决Request Too Long的问题
  2. NR 5G RLC无线链路控制
  3. notepad++ 远程连接阿里云服务器
  4. JMetro版本11.6.5和8.6.5发布
  5. 0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?
  6. Mozilla 的 Flash 杀手 'Shumway' 已经现身
  7. sql server序列_SQL Server中身份和序列之间的区别
  8. 2020年 Java开发者进阶手册.pdf(吐血整理)
  9. vivo手机点击android,了解Vivo手机几个小技巧,让您的手机变得更好用
  10. 分类预测 | MATLAB实现ELM极限学习机多特征分类预测
  11. yyuc php,YYUC框架与YYUC手册资料下载 | 无名
  12. 一键生成所有尺寸App Icon
  13. BIGEMAP手机离线地图——基于OruxMaps离线高清卫星地图制作发布
  14. 99行拓扑优化matlab程序解读,99行拓扑优化 代码解析
  15. cad lisp 螺栓_如何用cad画螺丝
  16. 《C语言程序设计》江宝钏主编-习题1-4-圆柱体
  17. IP地址归属地查询完整版
  18. springboot单文件下载和多文件压缩zip下载
  19. Android必知必会-自定义Scrollbar样式
  20. react基础教程学习(一)

热门文章

  1. 科大讯飞/百度/阿里/腾讯(BAT)智能语音识别(ASR)性能对比选择预计价格分享
  2. linux 提取cpio_linux cpio
  3. java端分词工具ANSJ插件的基本使用
  4. redis 缓存穿透、缓存击穿、缓存雪崩区别和解决方案
  5. 旭宇同创:拼多多怎么店铺定位?
  6. java挡板怎么写_Java挡板接小球游戏
  7. 相遇问题(力扣第462题)
  8. jmeter性能监控插件安装
  9. 同学,运维喊你来精简日志啦 - 日志瘦身方法论
  10. Excel 2010 VBA 入门 032 将列进行分组