数据结构---外部排序

个人介绍

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;录用…

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

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

responses-validator接口断言之状态码

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

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;这款软件涵…

详细介绍 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…

18.2 HTTP服务器-处理函数、响应404错误

1. 处理函数 处理来自客户端的请求&#xff0c;并回之以特定的响应&#xff0c;这是处理函数的主要任务。在处理函数中&#xff0c;我们通常会完成如下工作&#xff1a; 验证请求路径 http.Request.URL.Pathhttp.NotFound(...) 当请求没有对应的处理函数时&#xff0c;返回4…

Vue3【十六】TS中的接口、泛型,自定义类型

Vue3【十六】TS中的接口、泛型&#xff0c;自定义类型 TS中的接口、泛型&#xff0c;自定义类型 案例截图 目录结构 代码 app.vue <template><div class"app"><h1>你好世界! 我是App根组件</h1><Person /></div> </templat…

OpenAI官方Prompt工程指南详解!再也不怕写不好Prompt了!

使用AI聊天、AI写作、还是AI绘图等过程中Prompt具有重要意义。 那么Prompt要怎么写效果才好&#xff1f;有没有标准化的模板可以直接用&#xff1f; 有&#xff0c;OpenAI官方发布了一份提示词工程指南&#xff0c;该指南分享了6大策略即可让AI输出更好的结果。至此&#xff…

无线领夹麦克风哪个品牌性价比高?推荐领夹麦克风性价比最高品牌

当今的直播、短视频已经深深的融入到了我们的生活当中&#xff0c;很多小伙伴会通过拍摄短视频、Vlog来分享自己生活精彩的瞬间。不过录制视频时&#xff0c;如果单纯靠手机拾音&#xff0c;距离手机越远&#xff0c;声音越小越不清晰如果有噪音干扰&#xff0c;那更是“惨不忍…

ONVIF相关介绍

ONVIF致力于通过全球性的开放接口标准来推进网络视频在安防市场的应用,这一接口标准将确保不同厂商生产的网络视频产品具有互通性。2008年11月,论坛正式发布了ONVIF第一版规范——ONVIF核心规范1.0。随着视频监控的网络化应用,产业链的分工将越来越细。有些厂商专门做摄像头…

pytest中失败用例重跑

pip install pytest-rerunfailures 下载rerunfailures插件包 配置文件中加入命令 --reruns 次数 也可在命令行中pytest --rerun-failures2 可以在allure报告中看到重试效果

【Echarts系列】水平柱状图

【Echarts系列】水平柱状图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 水平柱状图如图所示&#xff1a; 数据格式 data [{name: 于洪区,value: 2736},{name: 新民市,value: 2844},{name: 皇姑区,…

C++:SLT容器-->queue

C:SLT容器-->queue 1. queue容器2. queue 常用接口 1. queue容器 先进先出队列允许从一端插入元素&#xff0c;从另一端删除元素队列中只有队头和队尾可以被外界使用&#xff0c;因此队列不允许有遍历行为队列中插入数据称为入队(push)&#xff0c;删除数据称为出队(pop) …

JS 实现动态规划

function getPaths(m, n) {// m * n 二维数组&#xff0c;模拟网格const map new Array(m)for (let i 0; i < m; i) {map[i] new Array(n)}// 如果只走第一行&#xff0c;就只有一条路径。所以第一行所有 item 都填充 1map[0].fill(1)// 如果只走第一列&#xff0c;也只有…

【vue3|第8期】深入理解Vue 3 computed计算属性

日期&#xff1a;2024年6月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…