版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第11章 外部排序1内容10.1 外部排序的概念和方法10.2 多路平衡归并排序10.3 置换-选择排序10.4 最佳归并树210.1 外部排序的概念和方法外排序:基于外部存储设备(或文件)的排序技术就是外排序。当待排序的对象数目特别多时,在内存中不能一次处理。必须把它们以文件的形式存放于外存,排序时再把它们一部分一部分调入内存进行处理。在排序过程中必须不断地在内存与外存之间传送数据。外部存储设备:磁带、磁盘3外部排序方法基于磁盘进行的排序多使用归并排序方法。排序过程主要分为两个阶段:(1) 建立用于外排序的内存缓冲区。根据它们的大小将输入文件划分为若干段,用某种内排序方法对各段进行排序。这些
2、经过排序的段叫做初始归并段或初始顺串(Run)。当它们生成后被写入外存。(2) 仿照内排序中介绍的归并树模式,把第一阶段生成的初始归并段加以归并,一趟趟地扩大归并段和减少归并段个数,直到最后归并成一个大归并段(有序文件)为止。4假设有 u=10000 个记录,分为 m=10 个段,每段有l=1000 个记录。R1R2R3R4R5R6R7R8R9R10R12R34R56R78R910R1234R5678R12345678R进行 k=2 路归并,则需要进行 s=4 趟归并。总归并趟数 s 等于归并树的高度 log2m。s= log2m5再假设磁盘每个物理块可容纳 200 个记录,则每趟 10000
3、 个记录需要50次读50次写,共 100 次操作。全部排序共需 d = 100*(4+1) = 500 次读写。假设有u=10000个记录分为m=10段,每段有1000个记录。进行 k=2 路归并,则需要进行 s = 4 趟归并。总归并趟数 s = logkm (归并树的高度 )外部排序需要的总时间为:tES = m*tIS + d*tIO + s*u*tmg内部排序所需总时间外存读写所需总时间内部归并所需总时间则上例中tES = 10*tIS + 500*tIO + 4*10000*tmg6因为tIO tmg,想要提高外排序的速度,应减少 d.d 和归并过程的关系:归并路数 k 总读写磁盘次
4、数 d 归并趟数s 2 500 4R1R2R3R4R5R6R7R8R9R10R1-5R67-10R1-10 5 300 2 10 200 1假设有u=10000个记录分为m=10段,每段有1000个记录。S越小,d越小7为了减小d,应该减小s。 s = logkm tES = m*tIS + d*tIO + s*u*tmg内部排序所需总时间外存读写所需总时间内部归并所需总时间8减小总读写次数 d的途径:增加归并路数k减小初始段数m。10.2 多路平衡归并排序 k-way Balanced merging 对于k 路平衡归并,如果有 m 个初始归并段,需要归并s = logkm 趟。6路平衡归并
5、树:36个初始归并段减小总读写磁盘次数 d的途径1:增加归并路数k910.2 多路平衡归并排序做内部 k 路归并时,在 k 个对象中选择最小者,需要顺序比较 k-1 次。每趟归并 n个对象需要做(n-1)*(k-1)次比较则 s 趟归并总共需要的比较次数为:随k增长而增长,增大k,会使得归并的时间增大办法:减小k 个对象中选最小的比较次数减小总读写磁盘次数 d的途径1:增加归并路数k10败者树用“败者树”从 k 个归并段中选最小者,当 k 较大时 (k 6),选出关键码最小的对象只需比较 log2k 次。则s趟归并总共需要的比较次数:利用败者树,只要内存空间允许, 增大归并路数 k, 将有效地
6、减少归并树深度, 从而减少读写磁盘次数 d, 提高外排序的速度。减小总读写磁盘次数 d的途径1:增加归并路数k11败者树败者树是一棵正则的完全二叉树,其中每个叶结点存放各归并段在归并过程中当前参加比较的对象;每个非叶结点记忆它两个子女结点中对象关键码大的结点(即败者);typedef int LoserTreek;typedef structKeyType key; ExNode, Externalk+1; 12 Run0: 10, 15, Run1: 9, 18, Run2: 20, 22, Run3: 6, 15, Run4: 12, 37, 61512371015918202212209
7、10640213b3b4b0b1b2Run3Run4Run0Run1Run2ls4冠军 (最小对象),输出段3当前对象选中ls2ls1ls0ls3ls0ls1ls2ls3ls431024LoserTree13 6151237101591820221220910640213b3b4b0b1b2Run3Run4Run0Run1Run2ls4冠军 (最小对象),输出段1当前对象ls2ls1ls0ls3153401自某叶结点bs到败者树根结点ls0的调整过程败者树-调整14/自某叶结点bs到败者树根结点ls0的调整算法void adjust ( LoserTree &ls, int s ) /从叶结点
8、 bs 开始,依次将当前的 bs 与父结点指示的失败者进行比较 /将失败者所在归并段的段号记入父节点中。/ adjustt = (s + k) / 2; / lst 是bs的父节点while(t 0) if (bs.key blst.key) slst;t = t/2;ls0 = s;败者树-调整败者树的高度为 log2k,在每次调整,找下一 个具有最小关键码对象时, 最多做 log2k 次关键码比较。15 615123710159182022b3b4b0b1b2Run3Run0Run1Run2ls4ls2ls1ls0ls3败者树-创建1)设bk为可能的最小值;2)设初值:lsi=k;1220
9、9106-55555b516初始化败者树12 615123710159182022b3b4b0b1b2Run3Run0Run1Run2ls4ls2ls1ls0ls33)依次从 bk-1,bk-2,b0出发调整失败者1220910655555-b5455败者树-创建17创建败者树:插入b4(12)5方法:将bi与其父节点指示的上次比较的失败者相比adjust (ls, 4 ) 6 615123710159182022b3b4b0b1b2Run3Run0Run1Run2ls4ls2ls1ls0ls33)依次从bk-1,bk-2,b0出发调整失败者;1220910645555-b5435败者树-创建
10、518创建败者树:插入b3(6)方法:将bi与其父节点指示的上次比较的失败者相比.adjust (ls, 3 ) 20 615123710159182022b3b4b0b1b2Run3Run0Run1Run2ls4ls2ls1ls0ls33)依次从bk-1,bk-2,b0出发调整失败者;1220910643555-b52败者树-创建1955创建败者树:插入b2(20)方法:将bi与其父节点指示的上次比较的失败者相比.adjust (ls, 2 ) 9 615123710159182022b3b4b0b1b2Run3Run0Run1Run2ls4ls2ls1ls0ls31220910643255
11、-b5152败者树-创建20创建败者树:插入b1(9)3)依次从bk-1,bk-2,b0出发调整失败者;方法:将bi与其父节点指示的上次比较的失败者相比.adjust (ls, 1 ) 10 615123710159182022b3b4b0b1b2Run3Run0Run1Run2ls4ls2ls1ls0ls31220910643215-b5130败者树-创建21创建败者树:插入b0(10)3)依次从bk-1,bk-2,b0出发调整失败者;方法:将bi与其父节点指示的上次比较的失败者相比.adjust (ls, 0 ) / 创建初始失败者树的算法void CreateLoserTree ( Lo
12、serTree &ls) /已知b0到bk-1为完全二叉树 ls 的叶结点, /其中存有 k 个关键字;bk 为辅助节点。 /沿从叶结点到根结点的k条路径将 ls 调整为败者树/ CreateLoserTree bk.key = MINKEY; /MINKEY为可能的最小值for ( i =0; i =0; -i ) Adjust( ls, i);败者树-创建22void k-Merge( LoserTree &ls, External &b ) /利用败者树将编号从0到k-1的k个输入归并到输出段 /b0 到 bk-1 记录 k 个输入段中当前记录的关键字/ k-Mergek-merge 算
13、法for( i =0; i k; +i ) input( bi.key ); /输入CreateLoserTree(ls); /创建初始败者树while ( bls0.key ! = MAXKEY) q = ls0; / q指示当前最小关键字所在段号output(q); / 输出q段中当前记录input(bq.key, q); / 输入q段中下一个记录Adjust(ls, q); / 调整败者树 /while23k-merge 算法当然,归并路数 k 的选择不是越大越好。因为归并路数 k增大时,相应需增加输入缓冲区个数。如果可供使用的内存空间不变,势必要减少每个输入缓冲区的容量,使内外存交换数
14、据的次数增大。2410.3 置换选择排序归并的趟数:s = logkm段数m = 记录总数n / 内存可容纳的记录数目如果减小m,则需要增加内存的使用量。但是内存的限制是一定的,如何在不增加内存的情况下减少 m 呢?在整个排序的过程中,选择最小关键字和输入输出交叉或平行进行。置换-选择排序减小总读写磁盘次数 d的途径2:减小初始段数m.2510.3 置换选择排序Replacement-Selection Sorting在整个排序的过程中,选择最小关键字和输入输出交叉或平行进行。设输入文件FI中24个对象的关键码序列为 51,49, 39, 46, 38, 29, 14, 61, 15, 30,
15、 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76假设内存工作区WA可容纳6个记录,得:Run1:29, 38, 39, 46, 49, 51Run2: 1,14, 15, 30, 48, 61Run3: 3, 4, 13, 27, 52, 63Run4: 24, 33, 46, 58, 76, 89减小总读写磁盘次数 d的途径2:减小初始段数m.2610.3 置换选择排序按照选择和置换方法构造初始排序段:过程的步骤如下: 从输入文件FI中把w个对象读入内存WA中,并构造败者树。 利用败者树在w中选择一个关键码最小的对象记为MINMAX。
16、将MINMAX记录写到输出文件FO中。27FOWA (6)FI空空51,49, 39, 46, 38, 29, 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76空51,49, 39, 46, 38, 2914, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76282951,49, 39, 46, 38, 1461, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76
17、29,3851,49, 39, 46,61, 1415, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7629,38,3951,49, 15, 46,61, 1430, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7629,38,39,4651,49, 15, 30,61, 141, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7629,38,39,46,4951,1, 15, 30,61, 1448, 52, 3, 63, 27,
18、 4, 13, 89, 24, 46, 58, 33, 7629,38,39,46,49,5148,1, 15, 30,61, 1452, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7629,38,39,46,49,51,6148,1, 15, 30,52, 143, 63, 27, 4, 13, 89, 24, 46, 58, 33, 7610.3 置换选择排序 若FI未读完, 则从FI读入下一个对象到WA中。从WA中所有比关键字MINMAX大的记录中,选择最小的记录,作为新的MINMAX;重复35 , 直到WA中选不出新的MINMAX为止。此时, 在输出文
19、件FO中得到一个初始归并段, 在它最后加一个归并段结束标志。 重复26, 直到WA为空。所得结果为:Run1:29, 38, 39,46,49,51,61Run2: 1, 3, 14, 15, 27, 30, 48, 52, 63, 89Run3: 4, 13, 24, 33, 46 ,58, 762910.3 置换选择排序在WA中选择MINMAX记录,需要用败者树实现。说明:(1)WA中的记录作为败者树的外部节点,败者树中的根节点的父节点指示WA中关键字最小的记录;(2)为了便于选出MINMAX记录,为每个记录除了关键字外,附加一个所在归并段序号。在比较时,先比段号,段号小的为胜;(3)败者
20、树的建立可从设工作区中所有记录的段号均为“零”开始,然后从FI中输入w个记录,自上而下调整败者树。300000000ls1ls0ls400关键码段号000000ls500000ls2ls3置换选择排序中的败者树初始化树310000000ls1ls0ls40000511ls500000ls2ls351,49, 39, 46, 38, 29, 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76551149139134b2b3b4b5b0b14612381132910置换选择排序中的败者树创建32MINMAX=292
21、9461239130ls1ls0ls444915511ls52913811ls2ls31420b2b3b4b5b0b11611351,49, 39, 46, 38, 29, 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76置换选择排序中的败者树调整(排序)33在比较时,先比段号,段号小的为胜29383MINMAX103429461239113ls1ls0ls444915511ls51426110ls2ls31523b2b3b4b5b0b151,49, 39, 46, 38, 29, 14, 61, 15, 3
22、0, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76置换选择排序中的败者树调整(排序)34在比较时,先比段号,段号小的为胜2938MINMAX3941246302214493353529214ls1ls0ls434915511ls51426110ls2ls31524b2b3b4b5b0b151,49, 39, 46, 38, 29, 14, 61, 15, 30, 1, 48, 52, 3, 63, 27, 4, 13, 89, 24, 46, 58, 33, 76置换选择排序中的败者树调整(排序)35在比较时,先比段号,段号小的为胜29
23、38MINMAX394630249123155148253416110.3 置换选择排序当输入的对象序列已经按关键码大小排好序时,只生成一个初始归并段。若输入文件有 n 个对象,生成初始归并段的时间在一般情况下,每输出一个对象,对败者树进行调整需要时间为O(log2w)。对于n 个对象,生成初始归并段的时间开销是O(nlog2w)3610.4 最佳归并树归并树是描述归并过程的 k 叉树。因为每一次做 k 路归并都需要有 k 个归并段参加,因此,归并树是只有度为0和度为 k 的结点的正则 k 叉树。示例:设有13个长度不等的初始归并段,其长度(对象个数)分别为 0, 0, 1, 3, 5, 7,
24、 9, 13, 16, 20, 24, 30, 38其中长度为 0 的是空归并段。对它们进行 3 路归并时的归并树。37此归并树的带权路径长度为 WPL(24+30+38+7+9+13)*2+ (16+20+1+3+5)*3 377。1620013536938139729030245483166路径长度:在归并过程中的读对象次数WPL 为归并过程中的总读对象数总的读写对象次数为 2*WPL=754为得到正则k叉树,增加空归并段。3810.4 最佳归并树不同的归并方案所对应的归并树的带权路径长度各不相同。为了使得总的读写次数达到最少,需要改变归并方案,重新组织归并树。将哈夫曼树的思想扩充到 k
25、叉树的情形。3910.4 最佳归并树例如,假设有 m=6 个初始归并段, 其长度(对象个数)分别为: 13, 16, 20, 24, 30, 38 做3路归并。归并树是只有度为 0 和度为 3的结点的正则 3叉树。 n0 = 2n3 + 1 n3 = (n0 - 1)2。假设需要增加的虚段数为 u,则 n3 =(m + u - 1) /2 为整数 u = (m-1) % 24010.4 最佳归并树为使归并树成为一棵正则 k 叉树,可能需要补入空归并段。补空归并段的方法为:归并树是只有度为 0 和度为 k 的结点的正则 k 叉树,设度为 0 的结点有 n0个,度为 k的结点有 nk 个,则有: n0 = (k - 1)nk + 1 nk = (n0 -1)(k - 1)。 如果 (m-1) % (k-1) = 0,则说明这 m 个叶结点(即初始归并段)正好可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版智能法律咨询APP下载服务条款3篇
- 2025场民法典中的技术合同风险评估与管理建议3篇
- 二零二五年度金融机构财务风险评估与控制合同范本3篇
- 2025年度珠宝产品货款抵押与定制设计合同3篇
- 2024调味品经销商合同
- 2024网站建设维护合同
- 二零二五年度智能楼宇电梯授权使用与能耗管理合同模板
- 2025年度货车驾驶员劳动合同(夜间运输安全协议)
- 二零二五年度研究生定向培养协议书:金融服务业研究生定向培养与职业规划合同
- 二零二五年度图书捐赠合同
- 新员工入职培训测试题附有答案
- 劳动合同续签意见单
- 大学生国家安全教育意义
- 2024年保育员(初级)培训计划和教学大纲-(目录版)
- 河北省石家庄市2023-2024学年高二上学期期末考试 语文 Word版含答案
- 企业正确认识和运用矩阵式管理
- 分布式光伏高处作业专项施工方案
- 陈阅增普通生物学全部课件
- 检验科主任就职演讲稿范文
- 人防工程主体监理质量评估报告
- 20225GRedCap通信技术白皮书
评论
0/150
提交评论