数据结构之外部排序

  外部排序就是对大型文件的排序,待排序的记录存放在外存。在排序的过程中,内存只存储文件的一部分记录,整个排序过程需要进行多次内外存间的数据交换。
  常用的外部排序方法是归并排序,一般分为两个阶段:在第一阶段,把文件中的记录分段读入内存,利用某种内部排序方法对记录段进行排序并输出到外存的另一个文件中,在新文件中形成许多有序的记录段,称为归并段;在第二阶段,对第一阶段形成的归并段用某种归并方法进行一趟趟地归并,使文件的有序段逐渐加长,直到将整个文件归并为一个有序段时为止。下面简单介绍常用的多路平衡归并方法。
  k 路平衡归并是指文件经外部排序的第一个阶段后,已经形成了由若千个初始归并段构成的文件。在这个基础上,反复将每次确定的k个归并段归并为一个有序段,将一个文件上的记录归并到另一个文件上。重复这个过程,直到文件中的所有记录都归并为一个有序段。
  设已经得到8个初始归并段,如下图所示,其中,bi表示第i个归并段。
在这里插入图片描述

  在树形选择排序中,首先对n个记录的关键字进行两两比较,然后在[ n 2 \frac n2 2n]个较小者之间再进行两两比较,如此重复,直到选出最小关键字的记录为止,该过程可用一棵有n个叶子结点的完全二叉树表示,如下图(a)所示。其中,每个非终端结点中的关键字等于其左、右孩子结点中较小的关键字,则树根结点中的关键字即为所有叶子中的最小关键字。在输出最小关键字之后,更新最小关键字所在的叶子结点数据,然后从该叶子结点出发,与其左 (兄弟) 结点的关键字进行比较,修改从叶子结点到根的路径上各结点的关键字,则根结点的关键字即为次小关键字,如下图 (b)所示。重复该过程,即可完成对所有记录的排序。
在这里插入图片描述

  在上图所示的树中,每个非终端结点记录了其左、右孩子中的“优胜者”,所以称其为“胜者树”。反之,若在双亲结点中记录比较后的失败者,而让胜者去参加更上一层的比较,便可得到一棵“败者树”。这样一来,当优胜者到达父结点时,立刻就知道原先在此比较的失败者并与失败者进行比较,再次记录新的失败者并让优胜者去进行更上一层的比较。在败者树中,每个结点只需和其父结点进行比较,而在胜者树中,向上调整时结点需和兄弟结点比较,那么就需得到兄弟结点的位置信息,因此败者树更易于编程。
  下图所示的是一棵实现8路归并的败者树。
在这里插入图片描述

  为了简便起见,设每个记录为一个整数,败者树用数组 ls[] 表示,Is[i] 的值为败者所在归并段的段号,令ls[1] 是树根结点,ls[0] 是 ls1的父结点,Is[0]中存储每次选出的优胜者所在归并段的段号,输出时则取 ls[0]指示的归并段的当前记录。例如,在上图所示的败者树中,叶子结点的数据来自各个归并段;败者树的根结点 ls[1]的父结点 ls[0] 中存储了优胜者(最小记录)所在的归并段。下图所示的是输出一个记录后,重新调整后的败者树。
在这里插入图片描述

  【算法】利用败者树实现K路平衡归并。

#define K8
#define MINKEY-1		/*比所有关键字都小的一个值*/
#define MAXKEY 10000 	/*比所有关键字都大的一个值*/
int b[K+1];
void K merge(int ls[K])
/*ls[0]~ls[K-1]是败者树的内部结点。b[0]~b[K-1]分别存储K个初始归并段的当前记录*/
/*函数 Get_nextRec(i)从第i个归并段读取并返回当前记录,若归并段已空,返回MAXKEY*/
{int i,q;for(i= 0; i<K; i++)b[i] = Get_nextRec(i);	/*分别读取K个归并段的第一个关键字*/b[K]= MINKEY;for(i= 0; i<K; ++i) ls[i]=K;	/*创建败者树,设置ls中败者的初值*/for(i=K-1; i>=0; --i)			/*依次从b[K-1]、b[K-2]、...、b[0]出发调整败者树*/Adjust(ls, i);while (b[ls[0]]!=MAXKEY){		/*ls[0]记录本趟最小关键字所在的段号*/q = ls[0];					/*q 是当前最小关键字所在的归并段*/printf("%d", b[q]);			/*输出最小关键字*/b[g]= Get_nextRec(g);Adjust(ls, q);				/*调整败者树,选择新的最小关键字*/}/*while*/
}/*Kmerge*/		

  【函数】败者树的调整:从叶子结点到根结点进行调整。

void Adjust(int ls(K], int s)		/*败者树存储在 ls[1]~s[K-1]中,s 为记录所在的归并段号*/
{int t, temp;t=(s+K)/2;						/* t为 b[s]的父结点在败者树中的下标,K 是归并段数*/while(t>0) {					/*若没有到达树根,则继续*/if(b[s]> b[ls[t]]) {		/*与父结点指示的数据进行比较*/temp = s; s = ls[t];	/*s指示胜者,胜者将去参加更上一层的比较*/ls[t] = temp;			/*ls[t]记录败者所在的段号*/}/*if*/t= t/2;						/*向树根回退一层*/}/*while*/1s[0] = s;						/*1s[0]记录本趟最小关键字所在的段号*/
}/*Adjust*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2778565.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】信号概念与信号产生

信号概念与信号产生 一、初识信号1. 信号概念2. 前台进程和后台进程3. 认识信号4. 技术应用角度的信号 二、信号的产生1. 键盘组合键2. kill 命令3. 系统调用4. 异常&#xff08;1&#xff09;观察现象&#xff08;2&#xff09;理解本质 5. 软件条件闹钟 一、初识信号 1. 信号…

vue项目搭建测试

5&#xff0c;项目测试 导入elementplus以及样式 import ElementPlus from element-plus import element-plus/dist/index.csscreateApp(App).use(store).use(router).use(ElementPlus).mount(#app)<template><el-row class"mb-4"><el-button>De…

python统计分析——两样本t检验

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 from matplotlib import pyplot as plt import seaborn as sns sns.set() 2、准备数…

【华为 ICT HCIA eNSP 习题汇总】——题目集12

1、企业网络内部常常采用私有 IP 地址进行通信&#xff0c;以下哪个地址属于私有 IP 地址&#xff1f; A、0.1.1.1 B、127.5.4.3 C、128.0.0.5 D、172.24.35.36 考点&#xff1a;网络层 解析&#xff1a;&#xff08;D&#xff09; A类 IP 地址中&#xff0c;10.0.0.0 ~ 10.255…

例36:打开文件读出文件内容

1.建立一个EXE工程&#xff0c;在主窗体上放一个按钮&#xff0c;如图32。 图32 在按钮的单击事件中输入代码&#xff1a; Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)Dim s as StringDim 文件 As CWSTR FF_OpenFileDialog(hWndForm,_"打开…

爬爬今天爬小说————爬虫练习

爬不同的的小说&#xff0c;会有略微的改动。 我今天这个是从一章的提前到全部的提前。 在我们电脑里面了&#xff0c;想怎么看就怎么看。 代码代码&#xff1a; import re import requestsheaders {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x6…

SAP-PP-01-004物料主数据MRP视图参数

一、MRP1 MRP组 系统运行的 mrp 控制参数的组别。包含物料主数据中的一些 MRP 参数字段及工厂运行 MRP 控制设置参数&#xff0c;例如策略组、消耗模式、重计划期间、计划区间、计划时界、BOM 展开、计划订单转换的采购申请&#xff08;PR&#xff09;类型等。 工厂特定的物料…

【Java八股面试系列】JVM-类和对象加载过程

目录 类和对象的加载过程 类的生命周期 类的加载过程 加载 验证 准备 解析 初始化 类卸载 对象的加载过程 类和对象的加载过程 什么是类加载和对象加载? 类加载&#xff08;Class Loading&#xff09;&#xff1a;这是指JVM在运行时将类的字节码文件加载到内存中的…

Cubase学习:音频转midi

大家好!我是诗书画唱!今天要分享的小技巧就是Cubase中的音频转midi的功能!希望对你有所帮助!以后我会在这个账号分享自己知道的很多小技巧!关注我!不迷路!大家也可以关注我后,在我的空间搜索关键词,找到各种对应的教程进行学习,非常的方便!而且自己的教程会尽可能纠…

算法学习——LeetCode力扣二叉树篇3

算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树…

【Linux】学习-深入了解文件的读与写

深入了解语言级别(C语言)文件操作的"读"与"写" 在学习前&#xff0c;我们先要知道在Linux下的一个原则&#xff1a;一切皆是文件 如何理解呢&#xff1f;举个外设的例子&#xff0c;比如键盘和显示器&#xff0c;这两个外设也可以其实本质上也是文件&…

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Viterbi译码原理

目录 一、引言 二、Viterbi译码的基本原理 2.1 卷积码与网格图 2.2 Viterbi算法的核心思想 2.3 路径度量与状态转移 三、Viterbi译码算法工作原理详解 3.1 算法流程 3.2 关键步骤 3.3 译码算法举例 3.4 性能特点 四、Viterbi译码的应用场景 4.1 移动通信系统 4.2 卫…

人工智能如何彻底改变身份欺诈

据 AuthenticID 称&#xff0c;近一半的企业报告合成身份欺诈有所增加&#xff0c;而生物识别欺骗和伪造 ID 欺诈尝试也有所增加。 在当今的数字化存在中&#xff0c;消费者和企业都面临着新的挑战&#xff0c;从考虑数字身份的影响到应对生成人工智能等新工具的使用和流行。与…

力扣[面试题 01.02. 判定是否互为字符重排(哈希表,位图)

Problem: 面试题 01.02. 判定是否互为字符重排 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1&#xff1a;哈希表 1.若两个字符串长度不相等&#xff0c;则一定不符合题意&#xff1b; 2.创建一个map集合&#xff0c;先将字符串s1中的每一个字符与其对应的数量存入集合…

计算机算术

计算机算术 数据是什么 数据是各种各样的信息&#xff0c;如数字、文本、计算机程序、音乐、图像、符号等等&#xff0c;实际上&#xff0c;信息可以是能够被计算机存储和处理的任何事物。 位与字节 计算机中存储和处理信息的最小单位是位&#xff08;Binary digit比特&#x…

CVE-2022-0760 漏洞复现

CVE-2022-0760 NSS [HNCTF 2022 WEEK2]ohmywordpress 【CVE-2022-0760】 题目描述&#xff1a;flag在数据库里面。 开题&#xff1a; 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面&#xff0c;有一个搜索框。 F12看看network。 又出现了这个Wor…

计算机二级C语言备考学习记录

一、C语言程序的结构 1.程序的构成&#xff0c;main函数和其他函数。 程序是由main函数和其他函数构成main作为主函数&#xff0c;一个C程序里只有一个main函数其他函数可以分为系统函数和用户函数&#xff0c;系统函数为编译系统提供&#xff0c;用户函数由用户自行编写 2.…

亚马逊认证考试系列 - 知识点 - LightSail介绍

一、引言 在当今云计算的时代&#xff0c;亚马逊网络服务&#xff08;AWS&#xff09;已成为业界领先的云服务提供商。其中&#xff0c;LightSail服务是AWS为简化云计算的入门和使用而推出的一项服务。它特别适合那些想要快速搭建网站、开发环境或小型应用的用户。通过LightSa…

提升MySQL访问性能

1. 读写分离 设置多个从数据库&#xff0c;从数据库可能在多个机器中。写操作在主数据库进行主数据库提供数据的主要依据 缓解了MySQL的读压力。 主从复制原理图如下 如果对于读操作有一致性要求&#xff0c;那么读操作去主数据库即可。 2. 连接池 因为一个请求必须要…

【数学建模】【2024年】【第40届】【MCM/ICM】【C题 网球运动中的“动量”】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 MCM Problem C: Momentum in Tennis In the 2023 Wimbledon Gentlemen’s final, 20-year-old Spanish rising star Carlos Alcaraz defeated 36-year-old Novak Djokovic. The loss was Djokovic’s first at Wimbledon…