多路平衡归并
一般说来,如果初始归并段有m个,那么这样的二路归并树就有élog2mù+1层,要对数据进行élog2mù遍扫描。采用k路平衡归并时,则相应的归并树有élogkmù+1层,要对数据进行élogkmù遍扫描。
 做内部归并时,在k个记录中选择最小者,需要顺序比较k-1次。每趟归并u个记录需要做(u-1)*(k-1)次比较,s趟归并总共需要的比较次数为:(其中U代表总的记录个数,k代表的是归并的路数 ,s=élog2mù 因为同层的归并是同时进行的)
  s*(u-1)*(k-1)=élogkmù*(u-1)*(k-1)
  =élog2mù*(u-1)* (k-1)/élog2kù
 其中,élog2mù*(u-1)在初始归并段个数m与记录个数u一定时是常量,而(k-1)/élog2kù在k增大时趋于无穷大。因此,增大归并路数k,会使内部归并的时间增大。若k增大到一定的程度,就会抵消掉由于减少读写磁盘次数而赢得的时间。

为了改善上面的归并的效率,引入了败者树算法
败者树是一棵有k个叶结点的完全二叉树,叶子结点存储记录,非叶结点可由关键字和它对应的记录地址构成。为讨论方便起见,设非叶结点的结构为:关键字,   输入有序段的路号
 对k个输入有序段进行k路平衡归并的方法如下:
(1) 取每个输入有序段的第一个记录作为败者树的叶子结点,建立初始败者树:两两叶结点进行比较,在双亲结点中记录比赛的败者(关键字较大者),而让胜者去参加更高一层的比赛,如此在根结点之上胜出的“冠军”是关键字最小者。                          (2) 胜出的记录写至输出归并段,在对应的叶结点处,补充其输入有序段的下一个记录,若该有序段变空,则补充一个大关键字(比所有记录关键字都大,设为kmax)的虚记录。
(3) 调整败者树,选择新的关键字最小的记录:从补充记录的叶结点向上和双亲结点的关键字比较,败者留在该双亲结点,胜者继续向上,直至树根的双亲。
 (4) 若胜出的记录关键字等于kmax,则归并结束;否则转(2)继续。

打开IDE
创建一个工程

声名如下

#include "stdafx.h"using namespace std;
//K路平衡归并
#include<iostream>
#include<iomanip>
//初始归并段个数
const int k=5;
const int m=4;//初始归并段中最多关键字个数
const int MAXKEY=999;//段结束标志
//二维数组b起磁盘文件作用
int b[k][m]={{3,5,13,MAXKEY},{4,6,MAXKEY},
{2,8,MAXKEY},{1,11,MAXKEY},{9,12,MAXKEY}};
typedef int keyType;
typedef struct
{keyType key;}ExNode;
ExNode buff[k][m];//结构体二维数组
int ls[k],st[k];void Merge(int k);
void Read_Buff(int i);
void CreateLoserTree(int ls[],int k);
void Adjust(int ls[],int j,int k);
//K路平衡归并实现算法
void Merge(int k)
{int q;
for(int i=0;i<k;i++) Read_Buff(i);
CreateLoserTree(ls,k);
q=ls[0];
while(buff[q][st[q]].key!=MAXKEY)
{cout<<setw(3)<<buff[q][st[q]].key;
++st[q];
int w=st[q];
if(st[w]==m) Read_Buff(w);
Adjust(ls,q,k);
q=ls[0];
}
}
//读取各归并段数据,并设置相关变量st[i]的算法实现
void Read_Buff(int i)
{for(int j=0;j<m;j++)
buff[i][j].key=b[i][j];
st[i]=0;
}
//重构败者树的算法实现
void Adjust(int ls[],int j,int k)
{int t=(j+k)/2;
while(t>0)
{if(ls[t]==-1) {ls[t]=j;return;}
if(buff[j][st[j]].key>buff[ls[t]][st[ls[t]]].key)
{int y=j;j=ls[t];ls[t]=y;}
t=t/2;
}
ls[0]=j;
}
//创建败者树的算法实现
void CreateLoserTree(int ls[],int k)
{for(int i=0;i<k;i++) ls[i]=-1;
for(int i=k-1;i>=0;i--) Adjust(ls,i,k);
}

调用如下

//K路平衡归并相关操作测试
void main()
{cout<<"运行结果:\n";
Merge(5);
cin.get();
}

运行如下

代码下载

http://download.csdn.net/detail/yincheng01/4790146

转载于:https://www.cnblogs.com/new0801/archive/2012/11/20/6177632.html

VC++2012编程演练数据结构《35》多路平衡归并相关推荐

  1. VC++2012编程演练数据结构《3》堆栈实现进制转换

    栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出 ...

  2. VC++2012编程演练数据结构《9》平衡二叉搜索树

    平衡二叉搜索树 任何结点的左子树和右子树高度最多相差1的二叉搜索树. (1)AVL树的插入算法 a. 插入结点之后仍然是AVL树,则不调整: b. 插入结点之后不再满足AVL树条件,则进行调整,根据导 ...

  3. VC++2012编程演练数据结构《31》狄杰斯特拉算法

    狄杰斯特拉算法 Dijkstra(狄杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很 ...

  4. VC++2012编程演练数据结构《12》二叉排序树

    二叉排序树(Binary Sort Tree)又称二叉查找树. 它或者是一棵空树:或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则 ...

  5. VC++2012编程演练数据结构《25》线索二叉树

    线索二叉树 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列.在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结点. ...

  6. VC++2012编程演练数据结构《36》磁盘文件进行排序

    如何给磁盘文件排序 问题描述: 输入:一个最多含有n个不相同的正整数的文件,其中每个数都小于等于n,且n=10^7. 输出:得到按从小到大升序排列的包含所有输入的整数的列表. 条件:最多有大约1MB的 ...

  7. 胜者树与败者树, 多路平衡归并外部排序

    胜者树与败者树   胜者树和败者树都是完全二叉树,是树形选择排序的一种变型.每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛. 不同的是,胜者树的中间结点记录的是胜者的标号 ...

  8. 多路平衡归并和败者树

    多路平衡归并和败者树 为什么要引入败者树? 什么是败者树? 后续 为什么要引入败者树? 我们都知道,增加归并路数k能有效减少归并趟数S,进而减少I/O.然而,增加归并路数k时,内部归并的时间将增加.做 ...

  9. VC++ 常用编程技巧总结

    VC++6.0的使用以及编程技巧整理 1.MDI子窗口一启动就最大化      BOOL   CChildFrame::PreCreateWindow(CREATESTRUCT&   cs) ...

最新文章

  1. 图解Oracle常用SQL语句
  2. linux++tar打包目录,linux中tar命令打包目录与排除目录打包linux操作系统 -电脑资料...
  3. 扪心自问!一百多道难搞的面试题,你能答对了多少?
  4. 使用优化器提示(Optimizer Hints)
  5. SAP SD:SAP信贷出口
  6. Spark算子:RDD基本转换操作–coalesce、repartition
  7. 在as3中只有事件(或该事件的子级)的发送者才能侦听事件
  8. Android 之自定义view实现水波纹效果
  9. python学习之路-书籍推荐
  10. python 图片拼接成固定行列
  11. 解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】
  12. Flask初级(十)flash与前台交互post详解
  13. 精准 iOS 内存泄露检测工具
  14. 大华股份2021年的半年报
  15. 生物计算机的发展和应用,计算机的发展及其在生物医学中的应用
  16. 联想笔记本使用Driver Booster更新驱动触控板失效解决方案
  17. OSG 读取OSGB倾斜数据
  18. 服务器交换机在机柜位置,1米2米1.2米机柜22u24u网络服务器交换机图腾机柜
  19. 手把手教你给小米游戏本安装macOS
  20. 计算机专业答辩系统抄袭怎么办,计算机毕业设计答辩怎么老是不过?

热门文章

  1. 使用NSURLProtocol实现UIWebView的离线缓存
  2. 〖经典〗网页特效汇总实例
  3. python 面试题(1)--- python模块
  4. 怎么修改html的空格大小,如何改变空格的大小 word空格间隔很大怎么调整
  5. ArcPy处理土地利用类型数据
  6. franz ubuntu_重新审视Unix理念,持续测试,Franz,Gitbase,Python,Linux等
  7. 机器学习深度学习研究者最重要的11张速查表
  8. exe msdt 无法上网_软网推荐:可装EXE程序的ReactOS
  9. PHP超链接传数据库值格式,php – 使用超链接更新数据库
  10. 可以访问本地mysql服务器的命令是_在用户访问本地MySQL服务器时,访问命令可以省略“–h localhost”。...