[工学]数据结构与算法分析第二版review8.ppt

[工学]数据结构与算法分析第二版review8.ppt

  1. 1、本文档共73页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]数据结构与算法分析第二版review8

DSdemo 典型的外排序算法: 归并排序 置换排序 外排序 当对象以文件形式存放于磁盘上的时候,通常是按物理块存储的。 物理块也叫做页块,是磁盘存取的基本单位。 每个页块可以存放几个对象。操作系统按页块对磁盘上的信息进行读写。 本节所指的磁盘是由若干片磁盘组成的磁盘组,各个盘片安装在同一主轴上高速旋转。各个盘面上半径相同的磁道构成了柱面。各盘面设置一个读写磁头,它们装在同一动臂上,可以径向从一个柱面移到另一个柱面上。 为了访问某一页块,先寻找柱面,移动臂使读写磁头移到指定柱面上:寻查 (seek)。 再根据磁道号(盘面号)选择相应读写磁头,等待指定页块转到读写磁头下:等待(latency)。因此, 在磁盘组上存取一个页块的时间: 基于磁盘进行的排序多使用归并排序方法。其排序过程主要分为两个阶段: 第一个阶段建立用于外排序的内存缓冲区。根据它们的大小将输入文件划分为若干段,用某种内排序方法对各段进行排序。这些经过排序的段叫做初始归并段或初始顺串 (Run)。当它们生成后就被写到外存中去。 第二个阶段仿照内排序中所介绍过的归并树模式,把第一阶段生成的初始归并段加以归并,一趟趟地扩大归并段和减少归并段个数,直到最后归并成一个大归并段(有序文件)为止。 示例:设有一个包含4500个对象的输入文件。现用一台其内存至多可容纳750个对象的计算机对该文件进行排序。输入文件放在磁盘上,磁盘每个页块可容纳250个对象,这样全部对象可存储在 4500 / 250=18 个页块中。输出文件也放在磁盘上,用以存放归并结果。 由于内存中可用于排序的存储区域能容纳750 个对象, 因此内存中恰好能存3个页块的对象。 在外归并排序一开始,把18块对象,每3块一组,读入内存。利用某种内排序方法进行内排序, 形成初始归并段, 再写回外存。总共可得到6个初始归并段。然后一趟一趟进行归并排序。 若把内存区域等份地分为 3 个缓冲区。其中的两个为输入缓冲区,一个为输出缓冲区,可以在内存中利用简单 2 路归并函数 merge 实现 2 路归并。 首先, 从参加归并排序的两个输入归并段 R1 和 R2 中分别读入一块,放在输入缓冲区1 和输入缓冲区2 中。然后,在内存中进行2路归并,归并出来的对象顺序存放到输出缓冲区中。 一般地,若总对象个数为 n,磁盘上每个页块可容纳 b 个对象,内存缓冲区可容纳 i 个页块,则每个初始归并段长度为 len = i * b,可生成 m = ?n / len? 个等长的初始归并段。 在做2路归并排序时,第一趟从 m 个初始归并段得到 ?m/2? 个归并段,以后各趟将从 l (l 1) 个归并段得到 ?l/2? 个归并段。总归并趟数等于归并树的高度 ?log2m?。 根据 2 路归并树, 估计 2 路归并排序时间 tES 的上界为: 对4500个对象进行排序的例子,各种操作的计算时间如下: 读18个输入块, 内部排序6段, 写18个输出块 =6 tIS+36 tIO 成对归并初始归并段 R1~R6 =36 tIO+4500 tmg 归并两个具有1500个对象的归并段R12和R34 =24 tIO+3000 tmg 最后将 R1234 和 R56 归并成一个归并段 = 36 tIO+4500 tmg 合计 tES=6 tIS+132 tIO+12000 tmg 由于 tIO = tseek + tlatency +trw, 其中,tseek和tlatency是机械动作,而trw、tIS、tmg是电子线路的动作,所以 tIO tIS,tIO tmg。想要提高外排序的速度,应着眼于减少 d。 若对相同数目的对象,在同样页块大小的情况下做 3 路归并或做 6 路归并(当然, 内存缓冲区的数目也要变化),则可做大致比较: 一般, 对 m 个初始归并段, 做 k 路平衡归并, 归并树可用正则 k 叉树(即只有度为 k 与度为0的结点的 k 叉树)来表示。 第一趟可将 m 个初始归并段归并为 l = ?m/k? 个归并段,以后每一趟归并将 l 个归并段归并成 l = ?l / k? 个归并段,直到最后形成一个大的归并段为止。树的高度= ?logkm? = 归并趟数S。 只要增大归并路数 k,或减少初始归并段个数 m,都能减少归并趟数 S,以减少读写磁盘次数 d,达到提高外排序速度的目的。 采用输入缓冲区、内部归并和输出缓冲区并行处理的方法,也能有效地提高外排序的速度。 k路平衡归并 (k-way Balanced merging) 做 k 路平衡归并时,如果有 m 个初始归并段,则相应的归并树有 ?logkm? +1 层,需要归并?logkm? 趟。下图给出对有36个初始

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档