数据结构--Chapter8(外排序)

数据结构:胜者树与败者树 主要介绍了胜者树和败者树的原理和相关应用 阅读详情

8 外排序

    上一章节中介绍的各种排序方法,其待排序的记录及其相关信息都是存储在内存中,无需借助外村就能完成整个的排序过程,这些排序叫做内部排序。但当待排序的记录其数据量较大时,则无法在内存中完成整体排序,为此需要将待排序的记录以文件的形式存储在外存储器中,排序时每次只能将文件中的部分记录数据装入内存进行处理,这样,要达到对文件整体排序的目的,则需要再内存和外存之间进行多次数据交换。像这种需要借助外存储器才能完成整个排序过程的排序就叫外排序。

8.1 外存的存取特性

1. 磁盘

    磁盘是一种随机存取(直接存取)的存储设备,可以直接存取设备上的数据。磁盘由盘片、盘片主轴、磁头和磁头控制器组成,其中,盘片是用于存储数据的,盘片被划分成多个同心圆,称为磁道,磁道由外向内从0开始顺序编号,所有的数据信息被记录在磁道上。磁盘一般由多个盘片组成,每一个盘片包含两个面,其中,最上面和最下面的外侧一般不存储信息。例如,一个磁盘由6个盘片组成,则有10个面可保存信息。

    所有的盘面的同一磁道构成一个圆柱,称为柱面,位于同一柱面上的磁道由上往下从0开始编号。每个磁道还可以划分成若干个部分,称为扇区,每个扇区的大小是512字节。扇区所在的磁道地址称为扇区号。

    例如,某磁盘有10个有效记录面,记录面上有效记录区域的内径为20cm,外径为30cm,道密度为10道/mm,每个磁道有16个扇区,每个扇区记录512字节,则该磁盘容量是:  记录面数x磁道数x磁道扇区数x扇区的字节数=10x(30-20)/2x10x10x16x512=40960000字节。

    要存取某一数据信息,首先需要找到数据所在的柱面,移动磁头到所在的柱面即磁道,然后移动磁头到具体的数据存放位置,因此,要存取磁盘上的数据信息所需要的时间由3部分组成:寻道时间、等待时间和传输时间。其中,寻道时间Tseek就是读写磁头寻找数据所在磁道并定位的时间,等待时间Tw就是将磁头移动到数据所在的起始位置,传输时间Trw就是读或写数据所需要的时间。即T=Tseek+Tw+Trw。

2. 磁带

    磁带作为主要的存储介质,一般磁带长3600英尺、宽0.5英尺。磁带可分为7道带和9道带,7道带的磁带,每一排可以存储8位即一个字节,其中7位是数据位,1位是奇偶校验位。通常情况下,磁带的存储密度是每英寸800位或1600位,磁带的移动磁头速度是每秒200英寸。

    磁带是一种启停设备,当磁头正在读写磁带上的记录时,如果要停止读写,必须经过一个减速过程,然后才能停止。同样,从磁头静止到开始读取数据时,磁头是经过一个加速旋转的过程,然后才能均匀的旋转达到稳定状态。因此,在磁带的每两个相邻记录之间,需要一个空白区域,这个空白区域称为间隙。间隙的大小通常是0.25英寸-0.75英寸。磁带的存储结构如下图:


8.2 外排序概述

    文件存储在外存上,因此,外部排序方法与各种外部设备的特性有关。外存设备一般分为两大类,一类是顺序存储设备,如磁带;另一类是直接存储设备,如磁盘。这儿讨论的是磁盘排序。

    外部排序最基本的方法是归并排序法,先按可用内存大小,将外存上含n个记录的文件分成若干个长度为l(l<n)的子文件或段,依次读入内存,再用一种有效的内部排序方法对文件的各个段进行排序,并将排序后得到的有序子文件重新写入外存,通常将排序后的子文件称为顺串(或归并段);第二阶段是进行多路归并,即采用多路归并方法对顺串进行逐趟归并,是顺串长度逐渐由小变大,直至得到整个有序文件为止。最初形成的顺串文件长度取决于内存所能提供的排序区大小和最初排序的策略,而归并路数取决于能提供的外存设备数。总结如下:

1)生成若干初始顺串(归并段)。将外存上含n个记录的文件分成若干个长度为l(l<n)的子文件或段,依次读入内存。

2)多路归并。对初始顺串逐趟合并,直至在外存上得到整个有序文件。

    外排序的时间消耗由生成初始顺串的时间、外存信息读/写时间、内部归并排序时间,但影响最大的是外存信息读写时间。对同一文件而言,进行外排序时所需要的外存信息读/写次数和内部归并的趟数是成正比的。

    对m个初始顺串采用k路归并时,归并的趟数s为:s=[logkm](向上取整)。所以,增加k或减少m都能减少s。所以:

1)减少初始顺串的个数m,由于记录的个数是一定的,即增加初始顺串的长度。

2)增加归并路数k,即多路归并。

8.2.1 多路平衡归并

     对m个归并段采用k路归并时,需要进行s=[logkm](向上取整)趟的归并,显然增加k,可减少归并的趟数,从而达到减少对外存的读/写次数,但是增加k会使得归并效率变低。

    如果利用“败者树”进行k路平衡归并,则可在k个记录中选出关键字最小/最大的记录时仅需进行[log2k](向上取整)次比较,从而使总比较次数变为[log2m](n-1),与k无关。

     败者树是一棵完全二叉树,其中每个叶子结点存放各归并段在归并过程中当前参加比较的记录;每个非叶结点记忆其两个子女结点中记录关键字中较大者的结点(即败者)。由于它是完全二叉树,因此,可以采用一维数组作为存储结构,假设一维数组为LS,树中元素有k个叶子结点,k-1个比较结点、1个冠军结点,所以以为数组共有2k个元素。其中,ls[0]为冠军结点,ls[1]--ls[k-1]为比较结点,ls[k]--ls[2k-1]为叶子结点,ls[k]--ls[2k-1]为叶子结点,同时用另外一个指针索引b[0]--b[k-1]指向叶子结点,b为一个附加的辅助空间,不属于败者树,初始化时存放一个含最小关键字MINKEY的叶子结点。

    利用败者树对k个初始归并段进行k路平衡归并排序的具体方法描述如下:

1)首先将k个归并段中第一条记录的关键字一次存入b[0]...b[k--1]中作为叶子结点创建初始败者树。

2)根据ls[0]的值确定最小关键字所在的归并段序号q,将该归并段的第一条记录输出到有序归并段,然后再将此归并段中的下一条记录的关键字存入上一条记录本身所在的叶子结点b[q]中。

3)重构败者树。将新的b[q]这个叶子结点与父结点进行比较,大的存放在父结点,小的与上一级父结点再进行比较,如此逐层向上调整,直到根结点,最后将选出的新的最小关键字下标同样存在ls[0]中。

4)重复步骤2)和3),直至所有记录都被写入到有序归并段中为止。

8.2.2 置换—选择排序

    生成初始归并段可采用内部排序法和置换—选择排序法。用内部排序法是按照可用内存空间大小将待排序的部分记录读入内存,然后用一种内部排序法进行排序,排序后再写入外存从而生成一个初始归并段。这种方法生成的所有初始归并段的长度只与可用内存空间大小有关,除了最后一个初始归并段它的长度可能小于l之外,其他的长度都与l相等,个数为[n/l]向上取整,其中,n为待排序的文件记录个数,l是可用内存空间大小。

    用置换—选择排序法则可以生成长度不等的初始归并段,且长度比l大,当输入文件中的记录是按其关键字随机排序时,所生成的初始归并段的平均长度为可用内存空间大小的两倍。因此,用置换—选择排序法可增加初始归并段的长度,从而减少生成的初始归并段的数目,进而减少多路归并的趟数。特别地,当输入文件记录以关键字顺序排序时,可得到一个长度与文件长度相等的归并段;当输入文件记录以关键字逆序时,得到的初始归并段的最大长度为可用内存空间的大小,最小长度为1。

     假设输入文件FI是待排序文件,输出文件FO存放初始顺串,WA是可以容纳m个记录的内存工作区,则置换—排序的基本过程为:

1)从FI输入m个记录到内存工作区WA。

2)从WA中选出关键字最小的记录MIN,其关键字为MINKEY。

3)将MIN输出到FO中。

4)若FI不空,则从FI中读入下一个记录,送到WA中。

5)从WA中所有的关键字大于MINKEY的记录中,重新选出关键字最小的记录MIN。

6)重复3)至5),直到在WA中选不出新的MIN记录为止,此时已得到一个初始顺串,所以输出一个结束标志到FO中。

7)重复2)至6),直到WA为空。此时,FO中将顺次存放着所有的初始顺串。

    下面演示置换—选择排序法的过程


    使用置换—选择排序法得到的顺串特点:

1)每个顺串内按关键字有序。

2)前一个顺串最后一条记录的关键字一定大于后一个顺串的第一个关键字。

    在工作区WA中选出MIN记录的过程要用到败者树来实现。


    这儿是用Java实现的外排序,多路归并时使用的是败者树,生成初始归并段时使用的是内部排序,不是置换—选择排序。参考代码

dataStructure_外部排序/多路归并/败者树/最佳归并树 从算法的执行过程中可以看到,高层的分支结点(strongerLoser)对应的败者叶结点的值是较低层分支结点(weakerLoser)来的强。我们用一次多路归并就完成了所有临时文件的归并,而并非按内存中的二路归并那样,一次归并两个子串,耗费$ \log _{2}n$次归并。从上面的分析来看,为了从给定的序列构建出最优m叉树,我们可以先补充合适数量的0权结点(虚段)在LT中,同一个子树根结点的各层分支结点中保存的败者结点(所属段的段号)存在一定关系。 阅读详情

相关推荐

【数据结构】外部排序、多路平衡归并与败者树、置换-选择排序(生成初始归并段)、最佳归并树算法

外部排序、多路平衡归并与败者树、置换-选择排序(生成初始归并段)、最佳归并树算法的知识点总结

小人物,大梦想! 2815

一文读懂胜者树与败者树

胜者树和败者树是在排序和归并排序算法中常用的两种数据结构,它们在大规模数据排序中具有高效性和良好的稳定性。本篇博客将详细介绍这两种数据结构。

Doublelv 的博客专栏。 7498

[选择树] 胜者树 | 败者树

选择树: 先用一个较大的时间复杂度将一些元素建成满足一定要求的树 每次处理,只会破坏树的部分结构 所以,局部调整即可恢复结构,从而降低时间复杂度 堆 【堆】一种数据结构,可以把堆看成一棵完全二叉树 这棵完全二叉树满足:任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值 大顶堆:父亲大孩子小 小顶堆:父亲小孩子大 【应用】 堆排序:https://blog.youkuaiyun.com/sum...

geodoer 4297

8-13外部排序-败者树

外部排序-败者树,多路平衡归并

欢迎来到我的博客 8199

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1669

Obsidian跨设备同步实战:阿里云OSS与Remotely Save插件配置指南

本文详细介绍了如何利用阿里云OSS对象存储与Remotely Save插件,为Obsidian笔记软件搭建一个低成本、高可靠性的私有化多端同步方案。从创建OSS Bucket、配置CORS规则、生成子账户密钥,到插件安装与多设备同步策略,提供了完整的实战配置指南,有效解决Obsidian用户的跨设备同步痛点。

qsc901234567的博客 1282

外部排序(败者树、置换-选择排序、最佳归并树)

对多路平衡树与败者树、置换-选择排序和最佳归并树进行归纳总结,并详细记录了它们的主要算法思想和示例,以便快速查阅。

kusunoki的博客 7369

Autosar_MCAL_Port

PORT Driver就是对微控制器(MCU)的整个PORT模块进行初始化配置。很多端口和管脚被分配有多种不同的功能,即可以进行引脚功能复用,比如通用I/O、adc、pwm、spi等功能。因此,对PORT必须有一个整体的配置和初始化,对各管脚的具体配置和使用取决于微控制器和ECU的引脚功能分配。PORT初始化数据应当尽可能高效地写到每个端口。DIO驱动中所用到的端口的配置和初始化都是在PORT驱动模块中完成的。因此,在使用DIO功能之前,应先进行PORT的初始化。1、PortContainer说明。

不断debug,优化中…… 238

【数据结构】败者树的建树与比较过程

显然,要选出最小值,只要比较 x 和 y 即可,若 x < y,那么 x 就是 A 和 B 中最小的,y 比 A 中的哪些元素小,我们并不关心。编号 1 对应的归并段没有元素了,那么输出 5,并移除 5 对应的子树,移除后的败者树被破坏了。,假设根节点为 0 和 1 对应子树进行比较,取出根节点对应的值,5 < 17,5 胜出。比较根节点为 3 和 4 对应子树,取出根节点对应的值,15 < 29,15 胜出。,15 是 4 号节点。为每个节点创建一个根节点,根节点的值是其编号,叶子节点是值。

m0_52733659的博客 3611

【QNX+Android虚拟化方案】129 - USB眼图参数配置

【QNX+Android虚拟化方案】129 - USB眼图参数配置

|~~~热爱生活、努力学习的小伙汁~~~| 820

肺癌术后随访离散选择实验(DCE)设计与SAS实现

随着肺癌早期诊断和治疗技术的进步,肺癌患者的生存率显著提高,术后随访管理成为提升患者生活质量的关键环节。然而,如何在有限的医疗资源下设计出既符合患者需求又具有成本效益的随访方案,是临床决策面临的重要挑战。 离散选择实验(Discrete Choice Experiment, DCE)是一种定量研究方法,通过模拟真实世界的选择情境,测量患者对不同随访方案属性的偏好程度。本研究旨在通过DCE方法,系统评估肺癌术后患者对随访服务的偏好,为制定以患者为中心的随访策略提供循证依据。

huanghm88的专栏 96

胜者树与败者树

胜者树与败者树          胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。         不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。          胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信

whz_zb的专栏 5万+

VMware16虚拟机:下载和安装教程

VMware16 虚拟机 下载和安装教程

MQ0522的博客 20万+

败者树构建与调整详解(含测试代码)

此文仅记录学习过程,详细讲解了败者树的构建过程以及构建完毕之后的调整。背景:在leetcode刷题时,遇到23.合并K个升序链表。第一时间就想到了外部排序用到的败者树,但是其数据结构让我一时半会难以想到如何构造,看来如果只是看一遍算法的话还是无法深刻理解其本质。(虽然可以用优先队列的小根堆可以做题目来,但是学习不是固地自封)反省:学习途中遇到的算法应该自己实现一遍,知道其中核心细节以及其主要用途,转化为自己的知识。

weixin_51737049的博客 1653

【K210+STM32项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(更新3.0版本)(完整工程资料源码)

STM32F407STM32F407_2(含有app功能)

嵌入式技术开发 2489

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

败者树

这是一个具有5个缓冲区的败者树 将败者存入节点中,胜者继续往上,最后的胜者存在0 当需要调整时,只需要与父节点比较 /** * 败者树调整 * @param s 调整位置 */ void adjust(int s) { //(s+K)/2为s的双亲 for (size_t t = (s + K) / 2; t...

思维缜密的博客 1468

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

K路归并排序与败者树

一、大文件的排序问题 在我们日常开发中有时候会遇到这样一个问题,有一个文件大小为10GB,现在要为里面的数据进行排序,而计算机的内存只有1GB,如何对这10GB的数据进行排序呢? 由于内存空间只有1GB我们无法一次性读取所有的文件来进行排序,因此需要借助外部排序来解决。外部排序的思路很简单,它采用了** 一种&quot; 排序-归并 &quot; **的策略。大概步骤如下: 1、把10GB文件大小分为10份,每一份1...

1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【数据结构】败者树

最近在复习王道考研数据结构,看到败者树这个视频觉得很新奇,以往实现k路归并都是用堆实现的,因此记录一下该算法的实现和实践。 王道考研数据结构-败者树 leetcode23.合并k个升序链表使用k路平衡归并策略,选出一个最小元素需要对比关键字(k−1)(k-1)(k−1)次,导致内部归并所需时间增加 考虑用败者树优化,败者树是一棵完全二叉树,k个叶结点分别是当前参加比较的元素,非叶结点用来记忆左右子树中的“失败者”,胜者往上继续比较,一直到根结点。树中记录的是归并段的序号而不是具体数值,这样做的好处是不需要

arcsin_90的博客 3015

外部排序——大文件排序

外部排序 外部排序指的是大文件排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。 一般来说外排序分为两个步骤:预处理和合并排序。首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长度为t的子文件(或段);其次,利用内部排序的方法,对每个子文件的t个纪录进行内部排序。这些经过排序的子文件(段)通常称为顺串(run),顺串生成后即将其写入外存。这样在外存上就得到了m个顺串(m=[n/t])。最后,对这些顺串进行归并

想飞的鱼的博客 3380

选择置换+败者树搞定外部排序

个人认为,外部排序是我们在学习过程中接触到的一个比较重要的算法,它既包含了基本的排序算法,又考察了对文件IO以及内存的理解,还展示了最基本的程序优化思想,可以说能够写好一个外部排序,就说明基本的编程能力已经过关了。本文将对整个外部排序的过程进行详细的分析,并介绍两个经典算法,最后附上完整的程序代码。 1. 问题描述   由于在现实环境中,有时候需要对一个非常大的文件进行排序,而计算机内存是有限...

weixin_30505225的博客 411

选择置换+最优多路归并+败者树,解决外排序问题

一.涉及知识 堆排序,归并排序, 选择置换,多路归并,败者树 文件io操作 对内存的理解 二.问题描述现实中,当需要对一个很大的文件中的记录进行排序,内存无法一次装下全部数据,就需要借助磁盘空间作为数据中转,即从n个中转文件中(中转文件内的数据先要在内存排好序),每次取出N/n(N为最大内存可用空间)长度的顺串(runs)在内存中排序,然后写入输出文件直到归并完成,中转文件数量为n,即是n路归并,以

lsf921016的专栏 2426

数据结构之败者树

败者树原理  2个子结点比较后的败者放入它们的父结点,而胜者送到它们父结点的父节点去再作比较,这才是败者树。ls[0]放的是最终的胜者。 堆:        当n较大的时候采用什么算法呢?首先我们分析上面的算法,当从N中取出一个新的数m的时候,它需要依次和max1,max2,max3……maxn比较,一直找到一个比m小的maxx,用m来替换max x,平均比较次数是n/2。可不可

Saga,一路向前 6134

败者树建立过程图示

==================================================

五月花 7106
上一篇: 数据结构--Chapter7(内排序)
下一篇: 数据结构--Chapter9(查找)
Wang_AI
博客等级 码龄12年 988粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值