外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树

本文主要是介绍外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 外部排序
    • 1.最基本的外部排序原理
    • 2.外部排序的优化
    • 2.1 败者树优化方法
    • 2.2 置换-选择排序优化方法
    • 2.3 最佳归并树

外部排序

为什么要学习外部排序?
答:
在处理数据的过程中,我们需要把磁盘(外存)中存储的数据拿到内存中处理,因为内存处理更快,但是由于内存空间较小,外存空间很大,外存中的数据元素太多,无法一次全部读入内存进行排序。所以,通过外部排序就是实现对于外存存储元素排序的方法。

1.最基本的外部排序原理

假设在外存中,我们有48个记录,按照每三个记录为一块,建立好基本16个分块。
注意:在建立基本的分块之前,外存的每个小分块要先进行内部排序,保证这16个分块内部是有序的。
内存中,有2个输入缓冲区和1个输出缓冲区,采用归并排序的思想,第一次,先从16个分块中拿出两块,分别放入缓冲区1和缓冲区2.然后每次从这两个缓冲区6的开头,选最小的,放入输出缓冲区,然后凑齐3个记录,就回填外存。以此类推,直到把这1个分块,变为8个分块。

第二次开始,本质还是这个过程,但是值得注意的是,我们必须保证输入缓冲区不空,即如果一旦一个缓冲区的元素被拿空了,要立刻用该分块的其它元素补上。
在这里插入图片描述

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

不难得知,采用多路归并可以减少归并趟数。

记结论:
生成初始片段r个,进行k路归并
则趟数S=⌈logkr

2.外部排序的优化

方法1
方法2
优化
增加k
减少r
增加相应的输入缓冲区
减少每次从k个归并段中选一个最小元素的关键字比较次数
败者树优化方法
置换-选择排序优化方法

2.1 败者树优化方法

败者树用来减少关键字的比较次数。

将各个归并段段开头加入到败者树的叶子结点,然后开始构造败者树,注意,中间结点记录的是,当前胜者是来自哪个归并端,在得到冠军来自3号归并端后,将3号归并段的叶子结点移除,将3号归并段新的结点补上,此时,不需要比较太多次,通过败者树向上比较,就可以得出新的冠军,以此类推。
在这里插入图片描述

效率分析:
对于k路归并,第一次构造败者树需要对比关键字k-1次,
有了败者树,选出最小元素,只需要对比⌈log2k

2.2 置换-选择排序优化方法

让归并段更少,即让归并段更长。

初始待排序文件,不断的将当前内存工作区中,大于minmax的最小值,加入归并段中,每加入一个,再从初始待排序文件中补充一个,直到内存工作区中的所有元素都小于minmax,然后开始输出归并段2,更改minmax,重复上述过程。

在这里插入图片描述

在这里插入图片描述

2.3 最佳归并树

对于归并过程进一步优化。

只讲干货:
每个初始归并端对应一个叶子结点,把归并段段块数作为叶子的权值。最好的归并的过程其实就是构造哈夫曼树的过程。
归并树的WPL=归并过程中的磁盘I/O次数

值得注意的是,k叉归并的最佳归并树一定是严格k叉树,所以很可能叶子结点的个数不满足构造严格k叉归并树,这时候需要补充虚段(权值为0的叶子结点,然后将这些权值为0的结点作为最初始的构造结点.

补充虚段的数量有公式:
(初始归并段数量-1)%(k-1)=u
若u=0,则说明不需要添加虚段,否则添加(k-1)-u个虚段。

下图是一个3路归并的最佳归并树。
在这里插入图片描述

这篇关于外部排序快速入门详解:基本原理,败者树,置换-选择排序,最佳归并树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048020

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时