第11章外部排序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
外部排序
将两个有序段归并成一个有序段的过程, 将两个有序段归并成一个有序段的过程,若 在内存进行,则很简单,上一章中的merge 在内存进行 , 则很简单 , 上一章中的 过程便可实现此归并。 过程便可实现此归并。 由于我们不可能将两个有序段及归并结果段 同时存放在内存中, 同时存放在内存中,在外部排序中实现两两 归并时,不仅要调用merge过程, 而且要进 过程, 归并时 , 不仅要调用 过程 行外存的读/写 行外存的读 写。
R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 └┬┘ └┬┘ └┬┘ └┬┘ └┬┘ R1’ R2’ R3’ R4’ R5’ └─┬─┘ └─┬─┘ | R1” R2” R3” └────────┬────────┘
二路归并
有序文件
R6 R7 R8 R9 R10 └──┴──┼──┴──┘
外部排序所需总的时间= 外部排序所需总的时间 内部排序(产生初始归并段 所需的时间m*tIS 产生初始归并段)所需的时间 内部排序 产生初始归并段 所需的时间 +外部信息读写的时间 外部信息读写的时间d*tIO 外部信息读写的时间 +内部归并所需的时间 s*utmg 内部归并所需的时间 tIS—为得到一个初始归并段进行内部排序所 为得到一个初始归并段进行内部排序所 需时间的均值; 需时间的均值; tIO—进行一次外存读 写时间的均值; 进行一次外存读/写时间的均值 进行一次外存读 写时间的均值; utmg—对u个记录进行内部归并所需时间; 个记录进行内部归并所需时间; 对 个记录进行内部归并所需时间
11.3 多路平衡归并的实现
路到多路(k路 ,增大k可以减少外存信 从2路到多路 路),增大 可以减少外存信 路到多路 息读写时间。 息读写时间。 k个归并段中选取最小的记录需要比较 次 个归并段中选取最小的记录需要比较k-1次 个归并段中选取最小的记录需要比较 为得到u个记录的一个有序段共需 个记录的一个有序段共需(u-1)(k-1) 为得到 个记录的一个有序段共需 若归并趟数为s次 那么对n个记录的文 次,若归并趟数为 次,那么对 个记录的文 件进行外排时, 件进行外排时,内部归并过程中进行的总的 比较次数为s(n-1)(k-1), 比较次数为
外部排序的方法
然后,对这些归并段进行逐趟归并, 然后,对这些归并段进行逐趟归并,使归并 有序的子文件)逐渐由小至大 段 (有序的子文件 逐渐由小至大 , 直至得到 有序的子文件 逐渐由小至大, 整个有序文件为止。 整个有序文件为止。 第一阶段的工作是上一章已经讨论过的内容。 第一阶段的工作是上一章已经讨论过的内容。 本章主要讨论第二阶段即归并的过程。 本章主要讨论第二阶段即归并的过程。
外部排序
假设有一个含10000个记录的文件,首先通 个记录的文件, 假设有一个含 个记录的文件 次内部排序得到10个初始归并段 过10次内部排序得到 个初始归并段 次内部排序得到 R1~R10,其中每一段都含 其中每一段都含1000个记录。 个记录。 其中每一段都含 个记录 两两归并,得到一个含10000个记录的有序 两两归并,得到一个含 个记录的有序 文件。 文件。 假设每个物理块可以容纳200个记录 , 则每 个记录, 假设每个物理块可以容纳 个记录 一趟归并需进行50次 一趟归并需进行 次“读”和50次“写”, 次 四趟归并加上内部排序时所需进行的读/写 四趟归并加上内部排序时所需进行的读 写 使得在外排中总共需进行500次的读 写。 次的读/写 使得在外排中总共需进行 次的读
按字符组(记录 存放 按字符组 记录)存放。 记录 存放。 磁带上相邻两组字符组之间要留一空白区, 磁带上相邻两组字符组之间要留一空白区, 叫做间隙IRG(Inter Record Gap)。通常为 叫做间隙 。 1/4~3/4英寸。 英寸。 英寸 组成块可减少IRG数目,可减少 操作。 数目, 操作。 组成块可减少 数目 可减少I/O操作
分析d和 归并过程”的关系: 分析 和“归并过程”的关系: 若对10个初始归并段进行 路平衡归并, 个初始归并段进行5-路平衡归并 若对 个初始归并段进行 路平衡归并,即 每一趟将5个或 个或5个以下的有序子文件归并成 每一趟将 个或 个以下的有序子文件归并成 一个有序子文件,仅需进行二趟归并, 一个有序子文件,仅需进行二趟归并,外排 时总的读/写次数便减至 写次数便减至2*100+100=300, 时总的读 写次数便减至 路归并减少了200次的读 写。 次的读/写 比2-路归并减少了 路归并减少了 次的读
对外存上信息的读/写是以“物理块” 对外存上信息的读 写是以“物理块”为单 写是以 位的。不同的存储设备, 位的。不同的存储设备,由于读写的方式不 组成物理块的情况也不相同。 同,组成物理块的情况也不相同。 1.磁带 磁带 磁带是一种启停设备,启停时间约为5毫秒 毫秒。 磁带是一种启停设备,启停时间约为 毫秒。 由于读/写信息应在旋转稳定时进行 写信息应在旋转稳定时进行, 由于读 写信息应在旋转稳定时进行,而磁 带从静止状态启动后, 带从静止状态启动后,要经过一个加速的过 程才能达到稳定状态;在读/写结束后 写结束后, 程才能达到稳定状态;在读 写结束后,从 运动状态到完全停止, 运动状态到完全停止,要经过一个减速的过 程。
⌊(logkm)(k-1)(n-1)⌋=⌊(log2m/log2k)(k-1)(n-1)⌋ ⌋ ⌊ ⌋
多路平衡归并的实现
增而增加, 而(k-1)/log2k随k增而增加,因此内部归并时 随 增而增加 间随k增长而增长了 增长而增长了, 间随 增长而增长了,抵消了外存读写减少 的时间。 的时间。 由此引出了“败者树” 的使用。 由此引出了“败者树”(tree of loser)的使用。 的使用 在内部归并过程中利用败者树 败者树将 个归并段 在内部归并过程中利用败者树将k个归并段 中选取最小记录比较的次数降为⌊ 中选取最小记录比较的次数降为⌊log2k⌋次使 ⌋ 总比较次数为⌊ 无关。 总比较次数为⌊(log2m)(n-1)⌋,与k无关。 ⌋ 与 无关
2.硬盘 硬盘
每块512个字节。 个字节。 每块 个字节
容量=片数×柱面数×扇区× 容量 片数×柱面数×扇区×512字节 片数 字节
存储设备
图1-12 磁盘的磁道及扇区
磁盘
在磁盘上读/写一个信息块的时间: 在磁盘上读 写一个信息块的时间: 写一个信息块的时间 TI/O=tseek+tla+n*twm tseek为巡查时间 巡查时间(seek time),即读 写头定位 ,即读/写头定位 时间; 时间; tla为等待时间 等待时间(latency time),即等待信息块 即等待信息块 的初始位置旋转到读写头下的时间; 的初始位置旋转到读写头下的时间; twm为传输时间 传输时间(transmission time)
数据结构
第十一章 外部排序
内容提要
11.1 11.2 11.3 11.4 外存信息的存取 外部排序的方法 多路平衡归并的实现 置换-选择排序 置换 选择排序
基本要求、重点、难点
基本 要求 重点 外部排序的各种方法
各种文件的内部组织形式
难点
各种文件的存取问题
11ቤተ መጻሕፍቲ ባይዱ1外存信息的存取 外存信息的存取
外部排序的方法
外部排序基本上由两个相对独立的阶段组成。 外部排序基本上由两个相对独立的阶段组成。 首先,按可用内存大小,将外存上含n个记 首先,按可用内存大小,将外存上含 个记 录的文件分成若干长度为l的子文件或 录的文件分成若干长度为 的子文件或段 (segment); ; 依次读入内存并利用有效的内部排序方法对 它们进行排序, 它们进行排序,并将排序后得到的有序子文 件重新写入外存, 件重新写入外存, 通常称这些有序子文件为归并段 顺串(run) 归并段或 通常称这些有序子文件为归并段或顺串
m—经内部排序之后得到的初始归并段的个数 经内部排序之后得到的初始归并段的个数 s—为归并的趟数; 为归并的趟数; 为归并的趟数 d—为总的读 写次数。 为总的读/写次数 为总的读 写次数。 其中tIO取决于所用的外部设备 显然, 取决于所用的外部设备, 其中 取决于所用的外部设备 , 显然 , tIO 要大得多。 较tmg要大得多。 要大得多 因此, 因此,提高外排的效率应主要着眼于减少外 存信息读写的次数d。 存信息读写的次数 。
多路平衡归并的实现
败者树是完全二叉树, 败者树是完全二叉树,因此数据结构可以采 用一维数组。其元素个数共2k个 用一维数组。其元素个数共 个。 1个冠军结点:ls[0], 个冠军结点: 个冠军结点 k-1个比较结点:ls[1]--ls[k-1], 个比较结点: 个比较结点 k个叶子结点:ls[k]--ls[2k-1] 个叶子结点: 个叶子结点 同时用另外一个指针索引b[0]--b[k-1]指向 指向k 同时用另外一个指针索引 指向 个叶子结点。 个叶子结点。 另外bk为一个附加的辅助空间 为一个附加的辅助空间, 另外 为一个附加的辅助空间,不属于败者 初始化时存着MINKEY的值。 的值。 树,初始化时存着 的值
多路平衡归并的实现
循环:确定 循环:确定ls[0]所存最小关键字来自于哪个 所存最小关键字来自于哪个 归并段的序号,存入q中 归并段的序号,存入 中; 将该归并段的首元素输出到有序归并段里, 将该归并段的首元素输出到有序归并段里, 然后把下一个元素关键字放入上一个元素本 来所在的叶子结点b[q]中; 来所在的叶子结点 中 调用Adjust顺着 顺着b[q]这个叶子结点往上调整 调用 顺着 这个叶子结点往上调整 败者树直到新的最小的关键字被选出来, 败者树直到新的最小的关键字被选出来,其 下标同样存在ls[0]中。 下标同样存在 中 循环过程直至所有元素被写到有序归并段里。 循环过程直至所有元素被写到有序归并段里。
R1 R2 R3 R4 R5 └──┴──┼──┴──┘
R1’
R2’
└──────┬──────┘
五路归并
有序文件
对同一文件而言, 进行外排时所需读/写外 对同一文件而言 , 进行外排时所需读 写外 存的次数和归并的趟数s成正比 成正比。 存的次数和归并的趟数 成正比。 一般情况下, 个初始归并段进行k-路平 一般情况下 , 对 m个初始归并段进行 路平 个初始归并段进行 衡归并时, 衡归并时,归并的趟数 s=⌊logkm⌋ ⌊ ⌋ 若增加k或减少 便能减少s。 或减少m便能减少 若增加 或减少 便能减少 。
多路平衡归并的实现
多路归并排序算法的过程大致为: 多路归并排序算法的过程大致为: 首先将k个归并段中的首元素关键字依次存 首先将 个归并段中的首元素关键字依次存 的叶子结点空间里; 入b[0]--b[k-1]的叶子结点空间里; 的叶子结点空间里 最小的关键字下标(即所在归并段的序号 即所在归并段的序号)存 最小的关键字下标 即所在归并段的序号 存 入ls[0]中; 中 调用CreateLoserTree创建败者树; 创建败者树; 调用 创建败者树
11.2 外部排序的方法
外部排序指的是大文件的排序, 外部排序指的是大文件的排序,即待排序的 记录存储在外存储器上, 记录存储在外存储器上,待排序的文件无法 一次装入内存, 一次装入内存,需要在内存和外部存储器之 间进行多次数据交换, 间进行多次数据交换,以达到排序整个文件 的目的。 的目的。 外部排序最常用的是多路归并排序, 外部排序最常用的是多路归并排序,即将原 文件分解成多个能够一次性装人内存的部分, 文件分解成多个能够一次性装人内存的部分, 分别把每一部分调入内存完成排序。然后, 分别把每一部分调入内存完成排序。然后, 对已经排序的子文件进行归并排序。 对已经排序的子文件进行归并排序。
记录
成块存放的磁带块大小1K~8K字节 字节 成块存放的磁带块大小
磁带
在磁带上读/写一个信息块的时间: 在磁带上读 写一个信息块的时间: 写一个信息块的时间 TI/O=ta+n*tw ta为延迟时间,即读 写头到达传输信息所在 延迟时间,即读/写头到达传输信息所在 物理块起始位置所需时间; 物理块起始位置所需时间; tw为传输一个字符的时间