多路平衡归并和败者树

  • 为什么要引入败者树?
  • 什么是败者树?
  • 后续

为什么要引入败者树?

我们都知道,增加归并路数k能有效减少归并趟数S,进而减少I/O。然而,增加归并路数k时,内部归并的时间将增加。做内部归并时,在k个元素中选取关键字最小的记录需要进行k-1次比较。每趟归并n个元素需要做(n-1)(k-1)次比较,S趟归并总共需要的比较次数是
S(n-1)(k-1)=[log k r] (n-1) (k-1)=[log 2 r] (n-1) (k-1)/[log 2 k]
式中,(k-1)/【log 2 k】随k的增长而增长,因此内部归并时间随k的增长而增长。这将抵消由于增大k而减小外存访问次数所得到的效益。因此,不能使用普通的内部归并排序算法。
为了是内部归并并不受k的增大的影响,引入了败者树。

什么是败者树?


败者树是树形选择排序的一种变体,可视为一棵完全二叉树。k个叶节点分别存放k个归并段在归并过程中当前参加比较的记录,内部节点用来记忆左右子树中的“失败者”,而让胜者往上继续进行比较,一直到根节点。若比较两个数,大的为失败者,小的为胜利者,则根节点指向的数是最小值。


因为k路归并的败者树深度为【log 2 k】,因此k个记录中选择最小关键字,最多需要【log 2 k】比较。所以总的比较次数为
S(n-1)【log 2 k】=[log k r] (n-1)【log 2 k】= (n-1) [log 2 r]
可见,使用败者树后,内部归并的比较次数与k无关了。因此,只要内存空间允许,增大归并路数k将有效地减少归并树的高度,从而减小I/O次数,提高外部排序的速度。
需要说明的是,归并路数k并不是越大越好。归并路数k增大时,相应的需要增加输入缓冲区的个数。若可供使用的内存空间大小不变,势必要减少每个输入缓冲区的容量,使得内存、外存交换数据的次数增大。当k值过大时,虽然归并趟数会减少,但读写外存的次数仍会增加。

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏。
订阅专栏后,可以在微信公众号上私聊我,直接发给你源码。
或者关注公众号。

编写不易,感谢支持。

多路平衡归并和败者树相关推荐

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

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

  2. VC++2012编程演练数据结构《35》多路平衡归并

    多路平衡归并 一般说来,如果初始归并段有m个,那么这样的二路归并树就有élog2mù+1层,要对数据进行élog2mù遍扫描.采用k路平衡归并时,则相应的归并树有élogkmù+1层,要对数据进行él ...

  3. K路归并排序与败者树

    一.大文件的排序问题 在我们日常开发中有时候会遇到这样一个问题,有一个文件大小为10GB,现在要为里面的数据进行排序,而计算机的内存只有1GB,如何对这10GB的数据进行排序呢? 由于内存空间只有1G ...

  4. 【外排序】外排序算法(磁盘排序、磁带排序) 外存设备结构分析 败者树多路归并 最佳归并树白话讲解

    外排序 外排序概述 外排序的基本方法是归并排序法 例子 总结 存储设备(可忽略) 磁带 磁带结构 磁盘 硬盘结构 块 硬盘上的数据定位 磁盘排序 磁盘排序过程 1.生成初始顺串 方法1(常规方法): ...

  5. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  6. 8-13外部排序-败者树

    败者树是树形选择排序的一种变体,可视为一棵完全二叉树.通过败者树,可以在k个归并段中选出最小关键字所需要的关键字对比次数更少. 绿色为叶子结点,存放初始数据 黑色为失败结点 蓝色为胜出结点 一.基本过 ...

  7. 外部排序归并排序 败者树

    一.定义问题 外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的.外部排序最常用的算法是多路 ...

  8. dataStructure_外部排序/多路归并/败者树/最佳归并树

    文章目录 外部排序 时间代价:为什么不用二路归并 概念 归并段 小结:每趟归并需要读写磁盘的次数取决于 内存工作区 严格k叉树 k叉树和k路归并的趟数s与初始归并段数量m的关系 提高外部排序性能 k路 ...

  9. 败者树 多路归并排序

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

最新文章

  1. Qt笔记-拖动文件到QWidget(获取拖动文件路径)
  2. 面临重重挑战 华为造车之路任重道远
  3. JAVA的节点流和处理流
  4. 解决Android log输出看不到的情况
  5. java垃圾回收机制GC
  6. 43、剑指offer--左旋转字符串
  7. import 导入模块学习
  8. mysql日常工作中批量插入效率问题
  9. (窗口隐藏工具 3.40)自动隐藏指定的应用窗口及托盘图标
  10. 如何快速设计《数字电路》的JK触发器、T触发器描述的驱动方程对应的次态K图——异或卡诺图法
  11. Arcgis修改栅格数据像素值
  12. 【SEBAL模型】地面特征参数反演01--大气透射率
  13. 电子元器件手册中assert和deassert的含义
  14. 平台卡卷API文档分享
  15. 每个程序员都应该了解的 CPU 高速缓存 英文原文:Memory part 2: CPU caches
  16. NanoPi NEO小试牛刀(一)
  17. B树,B+树,B*树以及R树的介绍
  18. 408考研大纲计算机网络,2021计算机考研408大纲:计算机网络部分解析及备考指导...
  19. serialize()和serializeArray()方法
  20. rtl8821 wifi驱动编译

热门文章

  1. NLOPT ros下的使用
  2. Git使用六:版本对比
  3. 二维数组(解引用、指针数组、数组的指针)——C语言
  4. mysqldump备份表中有大字段失败的排错过程
  5. Day 20:网络编程(1)
  6. JavaScript 'Pig latin is cool'=='igPay atinlay siay oolcay'
  7. SSM整理笔记1——SSM网站初步功能设计
  8. 朴素贝叶斯与贝叶斯网络
  9. Android Service完全解析
  10. 垂直型电商的投资魔法