- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
示例 如果做5路归并,让 k = 5,则有 (11-1)/(5-1) = 2,表示有2个度为5的内结点; 但是, u = (11-1) mod (5-1) =2 ≠0,表示有度小于5的结点; 这样就需要加一些空叶结点及一个内结点,内结点在归并树中代替了一个叶结点的位置,故一个叶结点参加这个内结点下的归并,需要增加的空初始归并段数为 k-u-1=5-2-1 = 2 应当补充2个空归并段。则归并树如图所示。 1 3 5 9 7 9 54 20 16 13 38 30 24 166 0 0 五路最佳归并树 它的带权路径长度WPL = (38+20+24+30)*1 + (13+16+7+9)*2 + (1+3+5)*3 = 229。 总读写次数为 :2*WPL=458. 小结 外排序算法是一种涉及外存读写的归并排序过程。 使用败者树进行k路平衡归并时每次比较记录数为[Log2k]。 选择置换可以生成不等长(可以比内存更大)的初始归并段。 对不等长的初始归并段采用最佳归并树进行归并,总读写次数最少。 败者树排序示例 (j) 输出21后调整 (k) 输出29后调整 (l) 输出32后调整 败者树排序示例 (m) 输出44后调整 (n) 输出56后调整, ∞升到loser[0] k 路平衡归并排序算法: void kwaymerge ( Element *r ) { r = new Element[k]; //创建对象数组 int *key = new int[k+1]; //创建外结点数组 int *loser = new int[k]; //创建败者树数组 for ( int i = 0; i k; i++ ) { //传送参选关键码 InputRecord ( r[i] ); key[i] = r[i].key; } for ( i = 0; i k; i++) loser[i] = k; key[k] = MaxNum; //初始化 for ( i = k-1; i=0; i-- ) //调整形成败者树 adjust ( key, loser, k, i ); while ( key[loser[0]] != MaxNum ) { //选归并段 q = loser[0]; //最小对象的段号 OutputRecord ( r[q] ); //输出 InputRecord ( r[q] ); //从该段补入对象 key[q] = r[q].key; adjust ( key, loser, k, q ); //调整 } Output end of run marker; //输出段结束标志 } 自某叶结点key[q]到败者树根结点的调整算法: void adjust ( int key[ ]; int loser[ ]; const int k; const int q ) {//q指示败者树的某外结点key[q], 从该结点起到根//结点进行比较, 将最小 key 对象所在归并段的段//号记入loser[0]。k是外结点key[0..k-1]的个数。 for ( int t = (k+q) / 2; t 0; t /= 2 ) // t是q的双亲 if ( key[loser[t]] key[q]) { //败者记入loser[t], 胜者记入q int temp = q; q = loser[t]; loser[t] = temp; } //q与loser[t]交换 loser[0] = q;} 注 意 归并路数 k 的选择不是越大越好。归并路数 k增大时,相应地需要增加输入缓冲区个数。如果可供使用的内存空间不变,势必要减少每个输入缓冲区的容量,使得内外存交换数据的次数增大。 初始归并段的生成 为了减少读写磁盘次数,除增加归并路数 k 外,还可减少初始归并段个数 m。在总对象数n 一定时,要减少 m,必须增大初始归并段长度。 如果规定每个初始归并段等长,则此长度应根据生成它的内存工作区空间大小而定,因而m的减少也就受到了限制。 为了突破这个限制,可采用败者树来生成初始归并段。在使用同样大的内存工作区的情况下,可以生成平均比原来等长情况下大一倍的初始归并段,从而减少参加多路平衡归并排序的初始归并段个数,降低归并趟数。 选择和置换方法 选择和置换的步骤如下:(1) 从输入文件FI中把 k 个对象读入内存中,并构造败者树。(内存中存放对象的数组r可容纳的对象个数为 k ) (2) 利用败者树在 r 中选择一个关键码最小的对象r[q],其关键码存入
您可能关注的文档
最近下载
- 怎样恢复已删除的文件.doc VIP
- 2025年中国铁道橡胶垫板数据监测报告.docx
- (NEW)电子科技大学数学科学学院857概率论与数理统计历年考研真题汇编(含部分答案).pdf
- 2023-2024全国初中物理竞赛试题精选精编第05讲凸透镜成像(解析版).docx VIP
- 2001-2016年电子科技大学《601数学分析》历年考研真题汇总(含部分答案).pdf VIP
- 古典文献学第二章 文献的形成和流布.ppt VIP
- 2025年综合窗口岗位工作人员招聘考试笔试试题(附答案).docx VIP
- 纪念中国红军长征胜利89周年PPT课件.pptx VIP
- 2025年中国衬橡胶设备数据监测报告.docx
- 中央民族大学非事业编制合同制职工招聘笔试试题及答案2021.docx VIP
文档评论(0)