数据结构之外部排序

  外部排序就是对大型文件的排序,待排序的记录存放在外存。在排序的过程中,内存只存储文件的一部分记录,整个排序过程需要进行多次内外存间的数据交换。
  常用的外部排序方法是归并排序,一般分为两个阶段:在第一阶段,把文件中的记录分段读入内存,利用某种内部排序方法对记录段进行排序并输出到外存的另一个文件中,在新文件中形成许多有序的记录段,称为归并段;在第二阶段,对第一阶段形成的归并段用某种归并方法进行一趟趟地归并,使文件的有序段逐渐加长,直到将整个文件归并为一个有序段时为止。下面简单介绍常用的多路平衡归并方法。
  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://www.mzph.cn/news/677099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch之search API

写在前面 本文看下查询相关内容&#xff0c;这也是我们在实际工作中接触的最多的&#xff0c;所以有必要好好学习下&#xff01; 1&#xff1a;查询的分类 主要分为如下2类&#xff1a; 1:基于get查询参数的URI search 2&#xff1a;基于post body的request body search&am…

Go语言安全编码:crypto/sha1库全面解析

Go语言安全编码&#xff1a;crypto/sha1库全面解析 简介SHA-1基础原理和特点SHA-1与其他哈希算法的比较代码示例&#xff1a;基本的SHA-1哈希生成 使用crypto/sha1处理数据处理字符串和文件的SHA-1哈希代码示例&#xff1a;为文件生成SHA-1哈希 常见错误和最佳实践 在实际项目中…

leetcode(双指针)283.移动零(C++详细题解)DAY3

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 示例 1: 输入…

【Make编译控制 06】CMake初步使用

目录 一、概述与安装 二、编译源文件 三、无关文件管理 一、概述与安装 CMake是一个跨平台的项目构建工具&#xff0c;相比于Makefile&#xff0c;CMake更加高级&#xff0c;因为CMake代码在执行的时候是会先翻译生成Makefile文件&#xff0c;再调用Makefile文件完成项目构…

辅警考试怎么搜答案?这4款足够解决问题 #微信#知识分享

对于大学生来说&#xff0c;每天面对各式各样的学习任务和问题&#xff0c;寻找合适的学习资源和工具成了我们的迫切需求。幸运的是&#xff0c;现如今有许多高效且实用的日常搜题和学习软件可以满足我们的需求&#xff0c;助力我们取得更好的学习成果。 1.颐博查题 这是一个…

Django问题报错:TypeError: as_view() takes 1 positional argument but 2 were given

一、错误位置 from django.urls import pathfrom users_app.views import RegisterView, LoginView, LogoutViewapp_name users urlpatterns [path("register/", RegisterView.as_view, name"register"),path("login/", LoginView.as_view, n…

Netty中的常用组件(三)

ChannelPipeline 基于Netty的网路应用程序中根据业务需求会使用Netty已经提供的Channelhandler 或者自行开发ChannelHandler&#xff0c;这些ChannelHandler都放在ChannelPipeline中统一 管理&#xff0c;事件就会在ChannelPipeline中流动&#xff0c;并被其中一个或者多个Chan…

VED-eBPF:一款基于eBPF的内核利用和Rootkit检测工具

关于VED-eBPF VED-eBPF是一款功能强大的内核漏洞利用和Rootkit检测工具&#xff0c;该工具基于eBPF技术实现其功能&#xff0c;可以实现Linux操作系统运行时内核安全监控和漏洞利用检测。 eBPF是一个内核内虚拟机&#xff0c;它允许我们直接在内核中执行代码&#xff0c;而无…

CVE-2022-0760 漏洞复现

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

华为数通方向HCIP-DataCom H12-821题库(单选题:461-480)

第461题 以下关于路由策略特点的描述,错误的是哪一项? A、能够修改路由属性,但是不能改变网络流量经过的路径 B、能通过控制路由器的路由表规模,来节约系统资源 C、能通过控制路由的接收、发布和引入,以提高网络的安全性 D、能通过修改路由属性,对网络数据流量可以合理规…

Java异常的处理 try-catch-finally

目录 什么是异常通过if-else处理异常用if-else堵漏洞的缺点 try-catch例第一种处理第二种处理第三种处理第四种处理 try-catch-finally例 System.exit(0);//终止当前的虚拟机执行 什么是异常 Exception&#xff1a;在程序的运行过程中&#xff0c;发生了不正常的现象&#xff0…

SpringCloud-Ribbon实现负载均衡

在微服务架构中&#xff0c;负载均衡是一项关键的技术&#xff0c;它可以确保各个服务节点间的负载分布均匀&#xff0c;提高整个系统的稳定性和性能。Spring Cloud 中的 Ribbon 就是一种负载均衡的解决方案&#xff0c;本文将深入探讨 Ribbon 的原理和在微服务中的应用。 一、…

12 ABC串口接收原理与思路

1. 串口接收原理 基本原理&#xff1a;通过数据起始位判断要是否要开始接收的数据&#xff0c;通过采样的方式确定每一位数据是0还是1。 如何判断数据起始位到来&#xff1a;通过边沿检测电路检测起始信号的下降沿 如何采样&#xff1a;一位数据采多次&#xff0c;统计得到高…

curl8.6.0 - CURLE_PEER_FAILED_VERIFICATION

文章目录 curl8.6.0 - CURLE_PEER_FAILED_VERIFICATION概述笔记END curl8.6.0 - CURLE_PEER_FAILED_VERIFICATION 概述 在看一个开源工程, 里面用到了curl和openssl, 但是工程使用vcpkg来管理的包, 用CMake来编译 依赖太多了, win10 编译选项为 vs2019 x64/Win32(或者Ninja)…

肯尼斯·里科《C和指针》第12章 使用结构和指针(1)链表

只恨当时学的时候没有读到这本书&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c; 12.1 链表 有些读者可能还不熟悉链表&#xff0c;这里对它作一简单介绍。链表(linked list)就一些包含数据的独立数据结构&#xff08;通常称为节点&#xff09;的集…

有关网络安全的课程学习网页

1.思科网络学院 免费学习skillsforall的课程 课程链接&#xff1a;Introduction to Cybersecurity by Cisco: Free Online Course (skillsforall.com) 2.斯坦福大学计算机和网络安全基础 该证书对于初学者来说最有价值&#xff0c;它由最著名的大学之一斯坦福大学提供。您可…

小游戏和GUI编程(3) | 基于 SFML 的字符阵

小游戏和GUI编程(3) | 基于 SFML 的字符阵 1. 简介 使用 EasyX 图形库时&#xff0c; 官方第一个例子是字符阵。 EasyX 不开源&#xff0c; 也不能跨平台&#xff0c; API 陈旧&#xff0c; API 是 C 而不是 C。 现在使用 SFML 来实现字符阵&#xff0c; 克服 EasyX 的这些问…

Java:Arrays类、Lambda表达式、JDK新特性(方法引用) --黑马笔记

一、Arrays类 1.1 Arrays基本使用 Arrays是操作数组的工具类&#xff0c;它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下&#xff1a;遍历、拷贝、排序等操作。需要用到的方法如下&#xff1a; public class ArraysTest1 {public stat…

深度学习(13)--PyTorch搭建神经网络进行气温预测

一.搭建神经网络进行气温预测流程详解 1.1.导入所需的工具包 import numpy as np # 矩阵计算 import pandas as pd # 数据读取 import matplotlib.pyplot as plt # 画图处理 import torch # 构建神经网络 import torch.optim as optim # 设置优化器 1.2.读取并处理数据…

清平乐-春风丽日

今天&#xff0c;是2024年农历除夕日&#xff0c;远方家人已于昨夜风尘扑扑地倦鸟归巢&#xff0c;团聚过龙年&#xff0c;今晨酣睡未起。老龄笔者心情极佳&#xff0c;一夜好梦醒来&#xff0c;推窗仰头展望苍穹&#xff0c;喜上心头&#xff1a;啊&#xff01;接连几天的小雨…