数据结构---外部排序

个人介绍

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述
🦁作者简介:一名喜欢分享和记录学习的在校大学生
💥个人主页:code袁
💥 个人QQ:2647996100
🐯 个人wechat:code8896

专栏导航

code袁系列专栏导航
1.毕业设计与课程设计:本专栏分享一些毕业设计的源码以及项目成果。🥰🥰🥰
2.微信小程序开发:本专栏从基础到入门的一系开发流程,并且分享了自己在开发中遇到的一系列问题。🤹🤹🤹
3.vue开发系列全程线路:本专栏分享自己的vue的学习历程。

非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 

在这里插入图片描述

在这里插入图片描述

外排序

在计算机科学中,外排序(External Sorting)是一种处理大规模数据的排序算法,通常用于处理无法一次性加载到内存中的数据集。外排序通过在内存和外部存储(如磁盘)之间进行数据交换和排序,以有效地处理大型数据集。以下是关于外排序的学习笔记,包括外排序的原理、实现方式和示例代码:

外排序的原理

  1. 分割阶段:将大型数据集分割成适合内存加载的块。
  2. 排序阶段:将每个块加载到内存中,在内存中使用常规排序算法(如快速排序、归并排序)对块进行排序。
  3. 合并阶段:将排好序的块合并成更大的块,直到整个数据集排序完成。

外排序的实现

外排序通常涉及到内存和外部存储之间的数据交换,需要考虑磁盘I/O的开销和效率。常见的外排序算法包括多路归并排序(Multiway Merge Sort)和置换-选择排序(Replacement Selection Sort)等。

代码示例

以下是一个简单的外排序示例代码,使用Python实现多路归并排序:

import heapqdef external_sort(input_file, output_file, chunk_size):with open(input_file, 'r') as f:chunk = []chunk_count = 0while True:line = f.readline().strip()if not line:breakchunk.append(int(line))if len(chunk) == chunk_size:chunk.sort()with open(f'chunk_{chunk_count}.txt', 'w') as chunk_file:for num in chunk:chunk_file.write(str(num) + '\n')chunk_count += 1chunk = []if chunk:chunk.sort()with open(f'chunk_{chunk_count}.txt', 'w') as chunk_file:for num in chunk:chunk_file.write(str(num) + '\n')chunk_count += 1# 多路归并with open(output_file, 'w') as out_f:heap = []files = [open(f'chunk_{i}.txt', 'r') for i in range(chunk_count)]for i, file in enumerate(files):num = int(file.readline().strip())heapq.heappush(heap, (num, i))while heap:min_num, file_idx = heapq.heappop(heap)out_f.write(str(min_num) + '\n')next_num = files[file_idx].readline().strip()if next_num:heapq.heappush(heap, (int(next_num), file_idx))for file in files:file.close()# 示例
external_sort('input.txt', 'output.txt', 1000)

外排序的应用场景

  1. 数据库系统中对大型数据表进行排序操作。
  2. 处理大规模日志文件或数据备份文件。
  3. 处理超出内存容量的数据集。
    优化:多路平衡归并
    若改用4 44路归并排序,则只需2 22趟归并,外部排序时的总读/写次数便减至32 × 2 + 32 = 96 32×2+ 32= 9632×2+32=96。因此,增大归并路数,可减少归并趟数,进而减少总的磁盘I / O I/OI/O次数。

一般地,对r rr个初始归并段,做k kk路平衡归并,归并树可用严格k kk叉树(即只有度为k kk与度为0 00的结点的k kk叉树)来表示。第一趟可将r rr个初始归并段归并为⌈ r / k ⌉ ⌈r/k⌉⌈r/k⌉个归并段,以后每趟归并将m mm个归并段归并成⌈ m / k ⌉ ⌈m/k⌉⌈m/k⌉个归并段,直至最后形成一个大的归并段为止。树的高度 − 1 = ⌈ l o g k r ⌉ = 归并趟数 S 树的高度-1=⌈log_kr⌉=归并趟数S树的高度−1=⌈log
k r⌉=归并趟数S。可见,只要增大归并路数k kk,或减少初始归并段个数r rr,都能减少归并趟数S SS,进而减少读写磁盘的次数,达到提高外部排序速度的目的
置换选择排序(Replacement Selection Sort)是一种外部排序算法,用于对大规模数据进行排序。它通过在内存中维护一个大小为M的最小堆(通常称为置换选择树),并利用置换策略来选择最小元素进行排序。以下是有关置换选择排序的学习笔记,包括算法原理、实现方式和示例代码:

置换选择排序

  1. 分割阶段:将大型数据集分割成适合内存加载的块,并在内存中维护一个大小为M的最小堆。
  2. 排序阶段:从每个块中选择最小的元素,并将其输出到排序文件中。
  3. 置换策略:当最小堆中的元素被选取后,需要从同一块中选择下一个最小元素来填充该位置,以保持最小堆的性质。

置换选择排序的实现

置换选择排序通常需要考虑内存和磁盘I/O之间的数据交换,以及置换策略的选择。下面是一个简单的置换选择排序示例代码,使用Python实现:

import heapqdef replacement_selection_sort(input_file, output_file, block_size):with open(input_file, 'r') as f:heap = []output = []block = []for line in f:block.append(int(line.strip()))if len(block) == block_size:block.sort()output.append(block[0])heapq.heappush(heap, (block[1], iter(block[1:])))block = []if block:block.sort()output.append(block[0])heapq.heappush(heap, (block[1], iter(block[1:])))with open(output_file, 'w') as out_f:while heap:min_val, next_val_iter = heapq.heappop(heap)output.append(min_val)try:next_val = next(next_val_iter)heapq.heappush(heap, (next_val, next_val_iter))except StopIteration:passfor val in output:out_f.write(str(val) + '\n')# 示例
replacement_selection_sort('input.txt', 'output.txt', 1000)

置换选择排序的应用场景

  1. 处理大规模数据集的外部排序需求。
  2. 数据库系统中对大型数据表进行排序操作。
  3. 处理超出内存容量的排序任务。

败者树(Loser Tree)是一种数据结构,通常用于外部排序算法中,特别是多路归并排序中。败者树的主要作用是在多路归并排序过程中快速找到当前最小的元素,并将其输出到排序结果中。以下是有关败者树的学习笔记,包括算法原理、实现方式和示例代码:

败者树

  1. 结构特点:败者树是一种完全二叉树,每个非叶子节点保存了其子树中的最小值,而叶子节点保存了数据源中的元素。
  2. 初始化:在初始化阶段,败者树的叶子节点被初始化为数据源中的元素,非叶子节点被初始化为一个较大的值(通常为正无穷大)。
  3. 选择最小值:在多路归并排序过程中,通过比较败者树的根节点和其子节点的值,可以快速找到当前最小的元素。
    1.将每个归并段的第一个元素作为叶子结点加入败者树中
    在这里插入图片描述
    2.从左至右、从上往下的更新分支节点的信息:判断其左右子树的大小,除了根节点(最上面那个结点)记录冠军来自哪个归并段外,其余各分支节点记录的是失败者来自哪个归并段。
    在这里插入图片描述
    3.取出最小的元素1 11后,从其所属的归并段中取出下一个元素6 66,依次与从叶子结点到根节点的各个结点所记录的败者信息进行对比。
    在这里插入图片描述

败者树的实现

败者树的实现通常需要考虑如何构建树结构、更新最小值以及输出排序结果。下面是一个简单的败者树示例代码,使用Python实现:

class LoserTree:def __init__(self, data):self.data = dataself.tree = [float('inf')] * (2 * len(data))self.leaves = len(data)self.build_tree()def build_tree(self):for i in range(self.leaves):self.tree[i + self.leaves] = ifor i in range(self.leaves - 1, 0, -1):self.tree[i] = self.compete(i)def compete(self, idx):while idx < self.leaves:left = idx * 2right = idx * 2 + 1if self.tree[idx] == -1 or (self.tree[left] != -1 and self.data[self.tree[left]] < self.data[self.tree[idx]]):idx = leftif right < 2 * self.leaves and (self.tree[idx] == -1 or (self.tree[right] != -1 and self.data[self.tree[right]] < self.data[self.tree[idx]])):idx = rightself.tree[idx // 2] = idxidx //= 2return self.tree[idx]# 示例
data = [3, 1, 4, 1, 5, 9, 2, 6]
loser_tree = LoserTree(data)
print([data[loser_tree.tree[1]] for _ in range(len(data))])

败者树的应用场景

  1. 在外部排序算法中,如多路归并排序,用于快速找到当前最小的元素。
  2. 处理大规模数据集的排序需求,特别是需要大量磁盘I/O的情况下。

注:参考文章

🎉写在最后

🍻伙伴们,如果你已经看到了这里,觉得这篇文章有帮助到你的话不妨点赞👍或 Star ✨支持一下哦!手动码字,如有错误,欢迎在评论区指正💬~

你的支持就是我更新的最大动力💪~
在这里插入图片描述

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

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

相关文章

【计算机毕业设计】266基于微信小程序的在线点餐

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【Nature子刊】最争气国人友好“灌水刊”,中科院3区升2区,录用仅1个月,2天见刊!

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

最长有效括号 - LeetCode 热题 90

大家好&#xff01;我是曾续缘&#x1f92a; 今天是《LeetCode 热题 100》系列 发车第 90 天 动态规划第 10 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 最长有效括号 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&…

【单片机毕业设计9-基于stm32c8t6的酒窖监测系统】

【单片机毕业设计9-基于stm32c8t6的酒窖监测系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇9基于stm32的酒窖监测系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -------------------…

Redis命令实践

Redis命令实践 Redis是一个开源的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中介。由于其高性能、丰富的数据结构和简单的命令集&#xff0c;Redis成为了许多现代应用程序的首选。以下是对Redis命令的详细实践介绍。 一、连接Redis服务器…

独而不孤,心动邂逅“情缘密语”虚拟数字人伴侣,让生活每一刻闪耀浪漫——全网首发全息智能伴侣数字人管家

【独而不孤&#xff0c;心动邂逅——“情缘密语”虚拟数字人伴侣&#xff0c;让生活每一刻闪耀浪漫】 在这个快节奏又偶尔孤单的世界里&#xff0c;每个人都值得被温柔以待&#xff0c;每颗心都渴望着理解与共鸣。为此&#xff0c;我们匠心推出了”情缘密语”您的理想虚拟全息数…

美国冷吨 日本冷吨英国冷吨的区别

冷吨的定义不是24小时内将0摄氏度的水冷冻成0摄氏度的冰所需要的冷量么&#xff1f;那么为什么会有三个单位的区别呢&#xff1f;是气候导致物性的变化么&#xff1f;还是别的什么原因&#xff1f;为什么美国冷吨和日本冷吨及英国冷吨不同呢&#xff1f; 基本单位不一样&#…

Python版与Java版城市天气信息爬取对比分析

在对比Python版和Java版城市天气信息爬取时&#xff0c;我们需要考虑多个方面&#xff0c;包括语言特性、库支持、代码简洁性、执行效率以及维护成本等。以下是对这两个版本进行的一些对比分析&#xff1a; 1. 语言特性 Python&#xff1a; 易于学习&#xff1a;Python的语法清…

使用HSSFWorkbook导出excel

导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version> </dependency>工具类 public class ExcelUtil {/*** 导出Excel* param sheetName sheet名称* param title 标…

基本药物采购使用

--医院采购基本药物金额数 select sum(采购基本药物金额数) 采购基本药物金额数 from ( select sum(t.实收金额) 采购基本药物金额数 from 住院费用记录 t,药品规格 a where t.收费细目ida.药品id and t.记录状态1 and a.基本药物基药 and t.收费细目id not in( …

装箱与拆箱, 包装类的缓存机制

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 装箱与拆箱 自动装箱: 是指将基本类型自动转换为对应的包装类对象的过程. 例如: Integer y 5; // 编译器自动将 int 5 转换为 Integer 对象自动拆箱: 是指将包装类对象自动转换为对应的…

responses-validator接口断言之状态码

概述 responses-validator 专用于对 reqeuests 的响应对象进行断言&#xff0c; 同时&#xff0c;为了更适用 yaml 的场景&#xff0c;支持了多种灵活、可扩展的写法&#xff0c;可用于搭建yaml接口自动化测试框架。 根据 reqeuests 响应对象的特点&#xff0c;responses-val…

多线程爬取百度图片

爬取网页图片 import urllib.parse import requests import os import time from concurrent.futures import ThreadPoolExecutorheaders {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0…

JVM知识点

JVM是什么 JVM&#xff08;Java Virtual Machine&#xff09;是 Java 虚拟机&#xff0c;用于运行 Java 编译后的二进制字节码&#xff0c;最后生成机器指令。JVM 是 Java 能够跨平台的核心 JDK&#xff0c;JRE&#xff0c;JVM三者关系 三者的关系是&#xff1a;一层层的嵌套关…

第26讲:Ceph集群OSD扩缩容中Reblanceing数据重分布

文章目录 1.Reblanceing数据重分布的概念2.验证Reblanceing触发的过程3.Reblanceing细节4.临时关闭Reblanceing机制 1.Reblanceing数据重分布的概念 当集群中OSD进行扩缩容操作后&#xff0c;会触发一个Reblanceing数据重分布的机制&#xff0c;简单的理解就是将扩缩容前后OSD…

护理考试搜题软件哪个免费?分享九个搜题直接出答案的软件 #知识分享#微信

培养自己的阅读习惯&#xff0c;并不仅仅限于课外读物&#xff0c;还包括学术期刊、行业报告等&#xff0c;以不断提升自己的知识水平和思考能力。 1.彩虹搜题 这是一个公众号 是一款专门针对于大学生或者是成年自考等学生顺利完成证件考试的应用软件&#xff0c;这款软件涵…

CTF比赛分类

一、CTF定义 CTF&#xff08;capture the flag&#xff09;&#xff1a;中文翻译“夺旗战”起初为西方传统体育运动&#xff0c;即两队人马互相前往对方基地夺取旗帜因其一攻一防的分配贴合黑客攻防形式&#xff0c;故此“CTF”现今一般代指网络安全竞赛。 二、CTF题型 WEB&a…

详细介绍 CNN 完成 CIFAR 图像分类任务

准备工作 这里用到的是&#xff1a; tensorflow-cpu 2.4 版本python 3.8 版本anaconda 自带的 jupyter notebook 本文大纲 加载、展示、处理 CIFAR 图像数据搭建 CNN 模型架构编译、训练模型测试模型 加载、展示、处理 CIFAR 图像数据 &#xff08;1&#xff09;这里国内…

一.iOS核心动画 - 关于图层与视图

引言 Core Animation听起来会让人误以为它只是用来做动画的&#xff0c;但是事实上它是从Layer Kit库演变而来的&#xff0c;其中做动画的功能只是Core Animation特性的一小部分。 Core Animation是一个复核引起&#xff0c;它的作用就是尽可能快地组合屏幕上不同的显示内容&…

Python | Leetcode Python题解之第143题重排链表

题目&#xff1a; 题解&#xff1a; class Solution:def reorderList(self, head: ListNode) -> None:if not head:returnmid self.middleNode(head)l1 headl2 mid.nextmid.next Nonel2 self.reverseList(l2)self.mergeList(l1, l2)def middleNode(self, head: ListNo…