排序:外部排序算法分析

1.外存与内存之间的数据交换

1.外存(磁盘)

操作系统以“块”为单位对磁盘存储空间进行管理,如:每块大小1KB
各个磁盘块内存放着各种各样的数据。

2.内存

磁盘的读/写以“块”为单位数据读入内存后才能被修改修改完了还要写回磁盘。

2.外部排序的原理

在这里插入图片描述

外部排序:数据元素太多,无法一次全部读入内存进行排序。

使用“归并排序”的方法,最少只需在内存中分配3块大小的缓冲区即可对任意一个大文件进行排序。

1.步骤
  1. 生成r个初始归并段(对L个记录进行内部排序,组成一个有序的初始归并段)
  2. 进行S趟k路归并, s = [ l o g k r ] s= [log_kr] s=[logkr]
2.构造初始归并段

“归并排序”要求各个子序列有序,每次读入两个块的内容,进行内部排序后写回磁盘。

3.进行k路归并
  1. 把k个归并段的块读入k个输入缓冲区
  2. 用“归并排序”的方法从k个归并段中选出几个最小记录暂存到输出缓冲区中
  3. 当输出缓冲区满时,写出外存
3.时间开销分析

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

3.影响外部排序效率的因素

主要因素是磁盘IO的读写次数。

4.优化思路

k路平衡归并:

  • ①最多只能有k个段归并为一个;
  • ②每一趟归并中,若有m 个归并段参与归并,则经过这一趟处理得到[m/k]个新的归并段
1.增加归并路数k,进行多路平衡归并

在这里插入图片描述

  • 重要结论:采用多路归并可以减少归并趟数,从而减少磁盘IO(读写)次数。
  • 对r个初始归并段,做k路归并,则归并树可用k叉树表示
  • 若树高为h,则归并趟数= h − 1 = [ l o g k r ] h-1 = [log_kr] h1=[logkr],
  • k越大,r越小,归并趟数越少,读写磁由次数钺小.

推导:k叉树第h层最多有 k h − 1 k^{h-1} kh1个结点,则 r ≤ k h − 1 r ≤k^{h-1} rkh1 ( h − 1 ) 最小 = 「 [ l o g k r ] (h-1)最小= 「[log_kr] (h1)最小=[logkr]

2.多路归并带来的负面影响:
  • ①k路归并时,需要开辟k个输入缓冲区,内存开销增加。
  • ②每挑选一个关键字需要对比关键字(k-1)次,内部归并所需时间增加(可以使用败者树减少对比次数)
3.减少初始归并段数量

结论:若能增加初始归并段的长度,则可减少初始归并段数量r。
可用“置换-选择排序”进一步减少初始归并段数量。

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

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

相关文章

Jmeter分布式压力测试

目录 1、场景 2、原理 3、注意事项 4、slave配置 5、master配置 6、脚本执行 1、场景 在做性能测试时,单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机…

2023-10-01 LeetCode每日一题(买卖股票的最佳时机)

2023-10-01每日一题 一、题目编号 121. 买卖股票的最佳时机二、题目链接 点击跳转到题目位置 三、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一…

[NOIP2012 提高组] 国王游戏(贪心,排序,高精度)

[NOIP2012 提高组] 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n n n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n n n 位大臣排成一排&…

Mac程序坞美化工具 uBar

uBar是一款为Mac用户设计的任务栏增强软件,它可以为您提供更高效和更个性化的任务管理体验。 以下是uBar的一些主要特点和功能: 更直观的任务管理:uBar改变了Mac上传统的任务栏设计,将所有打开的应用程序以类似于Windows任务栏的方…

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII,这就涉及了原语的使用,特此记录! 一、原语 与RGMII接口相关的原语: BUFG:全局时钟网络 BUFIO:只能采集IO的数据,采集IO数据的时候延时是最低的…

浅谈OV SSL 证书的优势

随着网络威胁日益增多,保护网站和用户安全已成为每个企业和组织的重要任务。在众多SSL证书类型中,OV(Organization Validation)证书以其独特的优势备受关注。让我们深入探究OV证书的优势所在,为网站安全搭建坚实的防线…

【自定义类型】--- 位段、枚举、联合

💓博客主页:江池俊的博客⏩收录专栏:C语言进阶之路👉专栏推荐:✅C语言初阶之路 ✅数据结构探索💻代码仓库:江池俊的代码仓库🎉欢迎大家点赞👍评论📝收藏⭐ 文…

React18+Ts项目配置husky、eslint、pretttier、commitLint

前言 我的项目版本如下: React: V18.2.0Node.js: V16.14.0TypeScript:最新版工具: VsCode 本文将采用图文详解的方式,手把手带你快速完成在React项目中配置husky、prettier、commitLint,实现编码规范的统…

使用sqlmap获取数据步骤

文章目录 1.使用sqlmap获取所有数据库2.使用sqlmap获取当前连接数据库3.使用sqlmap获取当前数据库下所有表名4.使用sqlmap获取当前数据库下某个表下所有列名5.使用sqlmap获取当前数据库下某个表下指定字段的数据6.测试当前用户是否是管理员7.使用burpsqlmap批量检测8.脱库命令9…

算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

1.区间问题 905.区间选点 给定N个闭区间[ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量,位于区间端点上的点也算作是区间内。 将每个按区间的右端点从小到大排序 从前往后依次枚举每…

记录:Unity脚本的编写

目录 前言添加脚本到unity编写c#脚本查看效果 前言 在学习软件构造这门课的时候,对unity和c#进行了 一定程度的学习,包括简单的建立地形,添加对象,添加材质等,前不久刚好学习了如何通过c#脚本对模型进行操控&#xff…

五、2023.10.1.C++stl.5

文章目录 65、请说说 STL 的基本组成部分?66、请说说 STL 中常见的容器,并介绍一下实现原理?67、请说说 STL 中常见的容器,并介绍一下实现原理?68、请你来介绍一下 STL 的空间配置器(allocator)&#xff1…

分布式并行训练(DP、DDP、DeepSpeed)

[pytorch distributed] 01 nn.DataParallel 数据并行初步 数据并行 vs. 模型并行 数据并行:模型拷贝(per device),数据 split/chunk(对batch切分) 每个device上都拷贝一份完整模型,每个device分…

密码技术 (5) - 数字签名

一. 前言 前面在介绍消息认证码时,我们知道消息认证码虽然可以确认消息的完整性,但是无法防止否认问题。而数字签名可以解决否认的问题,接下来介绍数字签名的原理。 二. 数字签名的原理 数字签名和公钥密码一样,也有公钥和私钥&am…

字符串函数(一)

✨博客主页:小钱编程成长记 🎈博客专栏:进阶C语言 字符串函数(一) 0.前言1.求字符串长度的函数1.1 strlen(字符串长度) 2.长度不受限制的字符串函数2.1 strcpy(字符串拷贝&#xff0…

直播协议 python 常见直播协议

1. 推流、直播 和 点播分别是什么意思? 推流 主播将本地视频源和音频源推送到云服务器,也被称为“RTMP发布”。 直播 即直接观看主播实时推送过来的音视频数据。 点播 视频源已经事先存储于云服务器之上的音视频文件,观众随时可以观看。 目…

怒刷LeetCode的第22天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:回溯算法 方法二:基于位运算的回溯 第二题 题目来源 题目内容 解决方法 方法一:动态规划 方法二:分治法 方法三:前缀和数组 第三题 题目来源 题目内容…

Acwing 842. 排列数字

Acwing 842. 排列数字 知识点题目描述思路讲解代码展示 知识点 DFS 题目描述 思路讲解 DFS重点是:顺序!(暴力的手法)(递归) 用 path 数组保存排列,当排列的长度为 n 时,是一种方…

【Leetcode】 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出&…

Java笔记五(数组)

目录 数组 数组声明创建 数组初始化的三种初始化类型: 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 数组的使用 示例一:计算所有的元素和以及查找最大元素 示例二:For-Each循环 示例三:数组作…