前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【漫画】什么是外部排序?

【漫画】什么是外部排序?

作者头像
Java3y
发布于 2019-08-27 08:23:06
发布于 2019-08-27 08:23:06
3350
举报
文章被收录于专栏:Java3yJava3y

公众号来源:苦逼的码农 作者:帅地 通过漫画的方式通俗易懂讲解什么是外部排序,建议阅读!

背景

西天取经的路上,一样上演着编程的乐趣.....

地哥笔误:40亿字节不是占8G,而是大概占16G

排序的时候我们可以选择快速排序或归并排序等算法。为了方便,我们把排序好的2G有序数据称之为有序子串吧。接着我们可以把两个小的有序子串合并成一个大的有序子串。

注意:读取的时候是每次读取一个int数,通过比较之后在输出。

按照这个方法来回合并,总共经过三次合并之后就可以得到8G的有序子串。

接下来把12个数据分成4份,然后排序成有序子串

然后把子串进行两两合并

输出哪个元素,就在那个元素所在的有序子串再次读入一个元素

继续

重复直到合并成一个包含6个int的有序子串

再把两个包含6个int的有序子串合并成一个包含12个int数据的最终有序子串

优化策略

解释下:例如对于数据2,我们把无序的12个数据分成有序的4个子串需要读写各一次,把2份3个有序子串合并成6个有序子串读写各一次;把2份6个有序子串合并从12个有序子串读写各一次,一共需要读写各3次。

多路归并

为了方便讲解,我们假设内存一共可以装4个int型数据

置换选择

例如我们可以从12个数据读取3个存到内存中,然后从内存中选出最小的那个数放进子串p1里;

之后再从在从剩余的9个数据读取一个放到内存中,然后再从内存中选出一个数放进子串p1里,这个数必须满足比p1中的其他数大,且在内存中尽量小

这样一直重复,直到内存中的数都比p1中的数小,这时p1子串存放结束,继续来p2子串的存放。

ps:我看的时候没看懂为啥有上面几条规则,于是跑去问了一下地哥。地哥的回答:在构造一个子串的时候,因为我们必须保存字串是“有序”的,所以我们从内存中选出的数,必须要比“上一次”选的数小。

例如(这时假设内存只能存放3个int型数据):

12个无序的int数据

读入3个到内存中,且选出一个最小的到子串p1

从内存中再次读取一个元素86

从内存中再次读取一个元素3

从内存中再次读取一个元素24

从内存中再次读取一个元素8

这个时候,已经没有符合要求的数了,且内存已满,进而用p2子串来存放,以此类推。

通过这种方法,p1子串存放了4个数据,而原来的那种方法p1子串只能存放3个数据。

(不知道堆排序的可以看下我之前写的文章:【算法与数据结构】堆排序是什么鬼?)

从12个数据中读取3个数据,构建成一个最小堆,然后从堆顶选择一个数写入到p1中。

之后再从剩余的9个数中读取一个数,如果这个数比刚才那个写入到p1中的数大,则把这个数插入到最小堆中,重新调整最小堆结构,然后在堆顶选一个数写入到p1中。

否则,把这个数暂放在一边,暂时不处理。之后一样需要调整堆结构,从堆顶选择一个数写入到p1中。

这里说明一下,那个被放在一边的数是不能再放入p1中的了,因为它一定比p1中的数都要小,所以它会放在下一个子串中

看这些文字会让人头大,我画图解释下吧。

从12数据读取3个数据

构建最小堆,且选出目标数

读入下一个数86

读入下一个数3,比70小,暂放一边,不加入堆结构中

读入下一个数据24,比81小,不加入堆结构

读入下一个数据8,比86小,不加入堆结构。此时p1已经完成了,把那些刚才暂放一边的数重新构成一个堆,继续p2的存放。

以此类推...

最后生成的p2如下:

这种方法适合要排序的数据太多,以至于内存一次性装载不下。只能通过把数据分几次的方式来排序,我们也把这种方法称之为外部排序

- End

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java3y 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Python正则表达式指南
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。 注意:本文基于Python2.4完成;如果看到不明白的词汇请记得百度谷歌或维基,whatever。 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。
CDA数据分析师
2018/02/05
1.1K0
Python正则表达式指南
Python 正则表达式大全(上)
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python知识大全
2020/02/13
7410
python模块之re(正则表达式)
匹配模式 re.ASCII 同re.A,对应的内联标识为(?a),用于向后兼容。使元字符\w, \W, \b, \B, \d, \D, \s和\S仅匹配ASCII字符。该模式只在string模式下有意
枇杷李子橙橘柚
2019/05/26
1.2K0
python 学习笔记(9)——Python 正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
my_sunshine
2020/10/15
6410
Python 中的正则表达式全部用法速查
正则表达式可以拼接,如果A和B都是正则表达式,那么 AB也是正则表达式.如果字符串p匹配A并且另一个字符串q匹配B, 那么pq可以匹配 AB.这就构成了由简单构建复杂的基础.除非:
用户7886150
2020/12/23
1.2K0
Python正则re模块学习笔记
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
没有故事的陈师傅
2019/07/28
6160
一文搞懂 Python 正则表达式用法
作者:枫叶云 来源:见文末 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
小小科
2018/06/20
1.1K0
Python re正则表达式学习
一、re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词。
py3study
2020/01/09
7200
Python正则表达式模块re
1.re.match(pattern, string, flags=0) 从字符串的起始位置匹配,如果起始位置匹配不成功的话,match()就返回none
菲宇
2022/12/21
4270
Python正则表达式模块re
Python正则表达式指南
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。 注意:本文基于Python2.4完成;如果看到不明白的词汇请记得百度谷歌或维基,whatever。 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大
小小科
2018/05/02
9940
Python正则表达式指南
python正则表达式
本篇将介绍python正则表达式,更多内容请参考:【python正则表达式】 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一些过滤逻辑。 给定一个正则表达式和另一个字符串,我们可以达到如下的目的: 给定的字符串是否符合正则表达式的过滤逻辑(“匹配”) 通过正则表达式,从文本字符串中获取到我们
用户1174963
2018/01/17
1.1K0
python正则表达式
Python3 正则表达式特殊符号及用法.md
正则表达式(Regular expressions 也称为 REs,或 regexes 或 regex patterns)本质上是一个微小的且高度专业化的编程语言。 它被嵌入到 Python 中并通过 re 模块提供给程序猿使用;而且Python 的正则表达式引擎是用 C 语言写的,所以效率是极高的。
全栈工程师修炼指南
2020/10/23
2.7K0
Python 学习入门(13)—— 正则表达式
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块。
阳光岛主
2019/02/19
1.2K0
Python 学习入门(13)—— 正则表达式
Python_正则表达式
re.compile():用于编译正则表达式,生成一个正则表达式对象,供 match() 和 search() 两个函数使用,一般建议使用这种编译方式
py3study
2020/01/19
5670
Python_正则表达式
python进阶(20) 正则表达式的超详细使用[通俗易懂]
  正则表达式(Regular Expression,在代码中常简写为regex、 regexp、RE 或re)是预先定义好的一个“规则字符率”,通过这个“规则字符串”可以匹配、查找和替换那些符合“规则”的文本。   虽然文本的查找和替換功能可通过字符串提供的方法实现,但是实现起来极为困难,而且运算效率也很低。而使用正则表达式实现这些功能会比较简单,而且效率很高,唯一的困难之处在于编写合适的正则表达式。   Python 中正则表达式应用非常广泛,如数据挖掘、数据分析、网络爬虫、输入有效性验证等,Python 也提供了利用正则表达式实现文本的匹配、查找和替换等操作的 re 模块。
全栈程序员站长
2022/09/19
3.7K0
python re 正则表达式学习总结
# -*- coding: utf-8 -*- import re import os #------------------------------------- re(正则表达式)模块 -------------------------------- #----------------------------------------------------------------------------------------------------- #-----------------------
py3study
2020/01/13
1K0
Python: Re(正则表达式)库入门
文章背景:正则表达式是用来简洁表达一组字符串的表达式。正则表达式可以用来判断某字符串的特征归属,主要用于字符串匹配中。本文介绍正则表达式的基本用法。
Exploring
2022/09/20
5770
Python: Re(正则表达式)库入门
Python:正则表达式re模块
我们在昨天的案例里实际上省略了第3步,也就是"取"的步骤。因为我们down下了的数据是全部的网页,这些数据很庞大并且很混乱,大部分的东西使我们不关心的,因此我们需要将之按我们的需要过滤和匹配出来。
Lansonli
2021/10/09
4350
Python面试题之Python正则表达式re模块
正则表达式,是一门相对通用的语言。简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的;此套规则,就是所谓的正则表达式。各个语言都有各自正则表达式的内置模块,包括Linux系统中sed、awk也都是使用正则表达式。当然Python中也有对正则表达式的支持,对应的就是Python内置的re模块。
Jetpropelledsnake21
2019/02/15
1.7K0
在python中使用正则表达式
所以为了避免这个情况,墙裂推荐使用原生字符串类型(raw string)来书写正则表达式。
冰霜
2022/03/15
7300
在python中使用正则表达式
相关推荐
Python正则表达式指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档