首页 > 其他分享 >哈夫曼树构造过程的证明

哈夫曼树构造过程的证明

时间:2023-12-10 10:22:05浏览次数:21  
标签:哈夫曼 合并 构造 儿子 最优 证明 节点

设我们已经构造出来了最优树\(T_n\),他的叶子节点分别是\(w_1≤w_2...≤w_n\)

假设\(T_n\)的最长的一条路的倒数第二个节点(即这条路叶子节点的父亲)\(x\)只有一个儿子,那么我们删掉这个节点\(x\),让他的儿子代替他,答案会变得更优,矛盾,所以\(x\)一定有两个儿子。我们假设这两个儿子不全为\(w_1\)和\(w_2\),即有一个儿子\(w_y\)且\(w_y≥w_2\),那我们将\(w_y\)与不在这里的\(w_1\)和\(w_2\)交换,答案不会变得更差,即一定可以构造出来一个最优树\(T_n\),使得\(x\)的两个儿子为\(w_1\)和\(w_2\)

我们在考虑收缩与展开。

假设\(T_n\)的\(w_1\)和\(w_2\)合并成了一个节点(具体来说,令\(w_1\)和\(w_2\)的父亲节点的权值为\(w_1+w_2\),然后删掉\(w_1\)和\(w_2\)),这颗新树为\(T_{n-1}^*\),那么\(V(T_{n-1}^*)=V(T_n)-w_1-w_2\)

同时,考虑点集\(\{w_3,w_4...w_n,w_1+w_2\}\)的最优树为\(T_{n-1}\),找到这个最优树权值为\(w_1+w_2\)的叶子节点,并将其展开(就是上面合并过程的逆过程),设得到的新树为\(T_n^*\),则有\(V(T_{n}^*)=V(T_{n-1})+w_1+w_2\)

那么我们把得到的两个式子相加,有\(V(T_{n-1}^*)-V(T_{n-1})+V(T_{n}^*)-V(T_n)=0\),由于\(T_{n-1}和T_n\)都是最优的,那么必须有\(V(T_{n-1}^*)=V(T_{n-1})\)和\(V(T_{n}^*)=V(T_n)\),即合并和展开后仍然是最优树

接下来考虑求\(T_n\),我们要求\(T_n\),如果能够将最小权值的两个节点合并并求出\(T_{n-1}\),那么就可以知道\(T_{n}\),然后一直递归下去,最后合并只剩一个节点即可

标签:哈夫曼,合并,构造,儿子,最优,证明,节点
From: https://www.cnblogs.com/dingxingdi/p/17892230.html

相关文章

  • 软件构造笔记
    今天软件构造考试结束了,这门课真的上的听玄幻的主要通过对ppt的整理得到的笔记格式是word里的格式,有原件和ppt,但是不方便直接发  有重构的书pdf软件构造前言l 推荐书目代码大全 代码整洁之道  重构改善既有代码设计l 主要都是ppt里的  合肥工业大学张高峰......
  • 秦疆的Java课程笔记:64 面向对象 构造器详解
    类中的构造器也称为构造方法,世在进行创建对象的时候必须要调用的。并且构造器有以下两个特点必须和类的名字相同必须没有返回类型,也不能写void构造器必须掌握!一个类即使什么也没写,也会存在一个方法//写一个空的Person类=========================publicclassPer......
  • SG定理证明
    前置知识有向图游戏概念。单个有向图游戏中\(\textrm{SG}\)函数的求值(\(\textrm{mex}\)运算)。以上内容请自行查阅,这里不会多说。前言本文受启发于OIWiki,采用相同的数学归纳法进行证明,但对计算的原理进行了补充,也补足了一些细节。网上许多\(\textrm{SG}\)定理的证明只......
  • 软件构造实验三
    JFinal极速开发框架实验 (2023.12.13日完成)    根据参考资料,学习JFinal极速开发框架的使用并如下任务:    任务一:了解Maven及其使用方法,总结其功能作用(占20%)    任务二:学习JFinal框架,基于Maven建立JFinal工程,并对JFinal框架功能进行总结介绍(占30%)    任务三:基......
  • java基础语法-pageage-构造方法-继承-多态
    java中的包-package包:包中有很多的类,根据类的功能不同,我们可以创建不同的包。包的主要功能:包的主要功能:用于分类管理包的基本语法package包的路径路径与路径之间使用点隔开:package.fatherlujing.sonlujing在一个文件中,可以没有包,或者一个包。但是不能出现两个包。......
  • JavaScript的设计模式—构造器模式
    设计模式介绍设计模式是我们在解决问题的时候针对特定问题给出的简洁而优化的处理方案在JS设计模式,最核心的思想:封装变化将变与不变分离,确保变化的部分灵活,不变的部分稳定构造器模式varemployee1={name:'Kerwin',age:100}varemployee2={name:'xiaoming',......
  • 无涯教程-D语言 - 构造与解析函数
    类构造函数类构造函数是该类的特殊成员函数,只要我们创建该类的新对象 ,该函数便会执行。构造函数的名称与类完全相同,没有任何返回类型,构造函数对于为某些成员变量设置初始值非常有用。以下示例解释了构造函数的概念-importstd.stdio;classLine{public:void......
  • NKOJ2180证明
    这是一个经典模板,先看老板的PPT但其实我个人觉得从冒泡排序理解是不好理解的这个问题的本质还是证明这种做法是正确的首先,逆序对个数是下限,因为交换一次相邻两个数,通过对这两个数的相对大小的讨论,会发现最多让逆序对个数减少一然后我们要找到一种合理的方法来达到这个下限,就......
  • 基于AI的架构优化:创新数据集构造法提升Feature envy坏味道检测与重构准确率
    本文分享自华为云社区《华为云基于AI实现架构坏味道重构取得业界突破,相应文章已被软工顶会FSE2023收录》,作者:华为云软件分析Lab。基于AI技术实现架构坏味道检测与重构建议是当前业界比较流行的做法,但此做法往往存在一个通病,即训练数据集的质量问题,如何构建大规模、高质量的训练......
  • 哈夫曼树哈夫曼编码
    一、 实验目的掌握哈夫曼算法二、 实验内容实验题目哈夫曼树哈夫曼编码三、  设计文档 四、   源程序 #include<bits/stdc++.h>usingnamespacestd;constintN=100010;structnode{    intnum,fa,ch;};boolst[N];intn;node*nodes;intfind(in......