zoukankan      html  css  js  c++  java
  • 最佳归并树

    最佳归并树

    归并树的神秘性质

    读写磁盘需要2*(6+8+14+16)

    每个初始归并段看作一个叶子结点,归并段的长度作为结点权值,则上面这颗归并树的带权路径长度WPL=2 * 1+(5+1+6+2) * 3 = 44 =读磁盘的次数 = 写磁盘的次数

    WPL:结点值*到根节点的路径长度

    重要结论:归并过程中的磁盘I/O次数 = 归并树的WPL * 2

    可以想到:如果要追求归并过程中的磁盘IO次数最小,就要使归并树WPL最小——哈夫曼树

    构造2路归并的最佳归并树

    一开始把每一个结点都看成一个个独立的树,接下来在这几颗树中挑选权值最小的两棵树,让他们称为兄弟。新的结点的权值是这两个孩子结点的权值之和。还剩下4颗树

    。。。如此操作。。。

    [最佳归并树WPL_{min} = (1+2)*4+2*3+5*2+6*1=34 ]

    读磁盘次数 = 写磁盘次数 = 34次

    总的磁盘I/O次数 = 68

    多路归并的情况

    显然不是最佳的归并树

    多路归并的最佳归并树

    原理和2路归并类似,选择权值最小的3个结点让他们成为兄弟

    [WPL_{min} = (2+3+6)*3 + (9+12+17+24+18)*2 + 30*1 = 223 ]

    归并过程中 磁盘的I/O总次数 = 446次

    如果减少一个归并段

    要做3路归并

    不正确!!!!

    最后一次归并是2路归并

    正确的做法

    对于k叉归并,若初始归并段的数量无法构成严格的k叉归并树,则需要补充几个长度为0的”虚段“,在进行k叉哈夫曼树的构造。

    添加虚段的数量

    对于k叉归并,若初始归并段的数量无法构成严格的k叉归并树,则需要补充几个长度为0的”虚段“,在进行k叉哈夫曼树的构造。

    k叉的最佳归并树一定是一棵严格的k叉树,即树中只包含度为k、度为0的结点。

    知识回顾

  • 相关阅读:
    面向对象——多态
    面向对象——继承
    面向对象—封装
    数组
    控制语句
    认识Java
    出入境大厅流程
    2021上半年感想
    记录2020
    读后感《从三分钟热度到一万个小时》
  • 原文地址:https://www.cnblogs.com/jev-0987/p/13322232.html
Copyright © 2011-2022 走看看