哈夫曼编码详细证明步骤

关于哈夫曼编码,想必大家都很清楚,这里来讲解一下他的详细证明方法。代码的话就不给了网上一大堆,我再给也没什么意思,这里主要讲明白正确性的证明。我将采取两种方法进行证明,一种常规的方法,还有一种采取强数学归纳法证明。如果你已经了解了哈夫曼可以直接去看证明的正确性

(由于画图软件问题,图中有一些竖线忽略即可)

这里写目录标题

  • 一:编码
    • 1.固定长度的编码
    • 2.变长的编码
    • 3.非前缀的变长编码
    • 4.变长与定长的编码比较
  • 二:编码与二叉树的关系
    • 1.定长的编码与树
    • 2.变长的编码与树
      • 前缀编码
      • 非前缀编码
  • 三:哈夫曼算法的描述
    • 1.哈夫曼算法解决的问题
    • 2.哈夫曼算法的步骤
  • 四:哈夫曼算法的正确性证明
    • 1.第一种证明方法(常规的方法)
      • (1)最优子结构性质的证明
      • (2)贪心选择性质的证明
      • (3) 这两个性质的关系
    • 2.第二种证明方法(数学归纳证明,采用强归纳法)

一:编码

1.固定长度的编码

对于编码问题最先想到的就是固定长度的编码例如

字母编码
A00
B01
C10
D11

2.变长的编码

这时我们就要想了是不是还有一个更优的编码,既然有定长的编码,自然的就会想到变长的编码,什么是变长的编码呢

字母编码
A0
B1
C01
D10

这种就是边长的编码,但是这种编码又有一种问题
如果我们的编码是0110,它对应的字母是什么呢?
我们发现它对应多种的字母如:ABBA,ABD
那这种编码就没有意义了,因为这种编码我们是没有办法解码的,解不了码就不知道传输的信息是什么了,自然也就没有意义了。

这种情况什么导致的呢,是因为A的编码是C的编码的前缀这就导致了二义性

3.非前缀的变长编码

既然是因为前缀导致了二义性,那就自然而然的会采用非前缀编码非前缀编码大家肯定都知道是什么意思了,这里来举一个例子:

字母编码
A0
B10
C110
D111

这种还会产生歧义吗?:
随便写一个编码
1010111:BBD
10111110: BDC
发现除了一些没有的编码比如101这种没有对应的坏码(这里不是哈夫曼的内容,那是检错校验的内容) 外其他的都是可以解码的。

4.变长与定长的编码比较

对于定长的编码的平均长度肯定就是固定的了,对于变长的编码就与编码的长度和他出现的概率有关了:例如上面的定长的平均编码长度是2,变长的话就先假设概率依次对应的是0.6,0.2,0.1,0.1;他的平均长度就是
∑ x ∈ {字母的集合} p ( x ) ⋅ len ( x ) = 0.6 ∗ 1 + 0.2 ∗ 2 + 0.1 ∗ 3 + 0.1 ∗ 3 = 1.6 \sum_{x \in \text{{\{字母的集合\}}}} p(x) \cdot \text{{len}}(x) = 0.6 * 1+0.2 * 2+0.1*3+0.1 * 3=1.6 x{字母的集合}p(x)len(x)=0.61+0.22+0.13+0.13=1.6
发现变长的比定长的要小。

二:编码与二叉树的关系

1.定长的编码与树

根据上面的定长编码,画一个二叉树
在这里插入图片描述
二叉树向左为0向右为1

2.变长的编码与树

前缀编码

在这里插入图片描述

非前缀编码

在这里插入图片描述
通过这几个例子我们发现二叉树与编码是存在一一对应的关系的。

三:哈夫曼算法的描述

1.哈夫曼算法解决的问题

哈夫曼是为了解决最优的非前缀编码问题,即平均编码长度的最小值,通过前面的例子可知编码的长度与树的深度是一样的。所以我们希望
∑ x ∈ {树的叶子节点} p ( x ) ⋅ len ( x ) \sum_{x \in \text{{\{树的叶子节点\}}}} p(x) \cdot \text{{len}}(x) x{树的叶子节点}p(x)len(x) 最小(注释:树的平均深度最小那么对应的平均编码长度就最小)

2.哈夫曼算法的步骤

假设给出的字母集合每一个字母都是一个单独的树,这些树组成集合TG,且对应于x∈TG设他的概率为p(x)

step 1: 从TG中选择概率最小的树a,和概率次小的树b合并。

step 2: 把step 1得到的新的树加入TG,并且把其概率设为p(a)+p(b),然后把a,b从TG中划掉

step 3: 重复上述步骤直到只剩下一棵树

所以哈夫曼就是把一个森林维护成树的过程

这里使用上述的非前缀编码举例子

字母概率
A0.6
B0.2
C0.1
D0.1

TG集合为:
在这里插入图片描述
(中间那条线为画图软件问题,无特殊含义)

step 1: 从TG中选择概率最小的树C,和概率次小的树D合并。

step 2: 把step 1得到的新的树加入TG,并且把其概率设为p(a)+p(b),然后把a,b从TG中划掉
在这里插入图片描述

TG变成了A,B,E树的集合C,D变成了E的子节点

step 3重复上述步骤:选择最小的合并,并且划去被合并的(最小的B,次小的E)
TG变成了A F的集合:
在这里插入图片描述
然后继续
在这里插入图片描述
这时TG就只有一棵树了,算法结束

然后看一下他们的编码,(二叉树向左是0向右是1)

字母编码
A0
B10
C110
D111

以上就是哈夫曼的所有步骤

四:哈夫曼算法的正确性证明

接下来就到了重头戏,正确性的证明

证明之前为了方便证明先说明一些符号的含义:
AG: 代表字母的集合
TG: 代表字母对应的树的集合(即每一个字母都看做一棵树,和上面的含义一样)
TAG: 字母最后构成的平均深度最小的二叉树
|TAG|: 表示他的最小平均深度
**a,b:**字母集合中概率最小和次小的字母
Ta: TG中概率最小的树
Tb: TG中概率次小的树

1.第一种证明方法(常规的方法)

贪心的证明往往就是证明贪心选择性质,和最优子结构性质然后就可以得到该算法是正确的

先确定一下子问题是什么:
在这里插入图片描述
他的子问题就是把最小的和次小的字母合成一个字母之后的树,合并之后的字母的概率为p©+p(D)
在这里插入图片描述

(1)最优子结构性质的证明

最优子结构就是原问题的最优解是子问题的最优解构成的:
子问题与原问题的关系是什么呢?
设T表示原来的树
T表示合并之后的树

根据上面的子问题图解可知,T是T的子问题

因为T中的最小概率的节点a和次小的节点b比T的节点c的深度要大一,所以
|T|=|T|+p(a)+p(b)
(例如上图的C,D合并成E之后树的平均深度就少了p( C)+p(D) ( @注解:算平均深度的时候就是只有叶节点,叶节点才是我们想要编码的字母)
设|T|是最优解,如果子问题最优的不是|T|而是|T*|那么|T * |+p(a)+p(b)才是最优的,与|T|是最优解产生矛盾,所以最优子结构得证

(2)贪心选择性质的证明

既然它是贪心选择,那么只要最开始的时候合并的两个树是Ta,Tb那就说明他是以贪心选择开始的(即TAG的最深的两个节点就是节点a,b)
设一开始合并的是Tx,Ty:
那就有三种情况

第一种情况Tx,Ty就是Ta,Tb
第二种情况Tx,Ty不是Ta,Tb
第三种情况Tx,Ty中只有一个Ta或Tb
对于第一种情况,那么他就是以贪心选择开始的;
对于第二三种情况证明是类似的,这里证明更难的第二种:
那就把它换成Ta,Tb构成新的一棵树TAG*:换之后的影响是什么呢?考虑一下:
因为除了Tx,Ty,Ta,Tb其他的节点都是不变的所以只需要考虑这四个即可
|TAG| - |TAG *|=
p(x)(x在TAG的深度 - x在TAG*的深度)+
p(y)(y在TAG的深度 - y在TAG*的深度) +
p(a)(a在TAG的深度 - a在TAG*的深度) +
p(b)(b在TAG的深度 - b在TAG*的深度)
( 因为x,y与a,b交换所以他们的深度也就交换了即深度x=深度a 深度y=深度b或则 深度y=深度a 深度x=深度b其实这两个是一种情况深度x=深度a 深度y=深度b也可以表示 深度y=深度a 深度x=深度b因为我们取的下x,y都是随机的,x与y可以是任何值,所以说他俩交换之后,x仍然是x,y仍然是y)

这里计算时设a,x交换b,y交换
这样上面的式子可以化为

|TAG| - |TAG *|=
p(x)(a在TAG*的深度 - x在TAG*的深度)+
p(y)(b在TAG*的深度 - y在TAG*的深度) +
p(a)(x在TAG*的深度 - a在TAG*的深度) +
p(b)(y在TAG*的深度 - b在TAG*的深度)

={p(x)-p(a)}*(a在TAG *的深度 - x在TAG 的深度)+{p(y)-p(b)}(b在TAG *的深度 - y在TAG *的深度)
>=0
*(注解:为什么会大于等于零,因为p(a),p(b)是最小的,并且在TAG 中a,b节点是最深得)
又因为TAG是最优解,所以有|TAG| - |TAG *|<=0
所以可以得到|TAG| = |TAG *|,得证TAG *也是一个最优解
所以他总是以贪心选择开始,并且选择完之后又出现一个类似的子问题,还是重复上述的步骤。

(3) 这两个性质的关系

这里特别说明一下贪心选择性质:我看网上的定义都是这样的经过一系列的局部最优选择最后可以构成整体最优解。我感觉这时不准确的,这不就是贪心的定义吗,这样和贪心有啥区别呢?我的理解是当前的局部最优选择可以构成该问题的最优解(注:我说的是该问题不是整体问题,如果他再满足最优子结构那就是满足贪心算法了,后面给出公式后进行详解)

满足这两个性质之后就可以说他是满足贪心的
如果只满足贪心选择,就只能说明这一步选择是最优解的一部分,但是对于选择完之后剩下的子问题,我们不能确定是不是他的最优解构成原问题的最优解。
如果只满足最优子结构那么他就不能说明他是贪心选择得来的。

其实就是一个等式关系:
原问题最优解=这一步的局部最优解+选择完之后子问题的最优解。
然后子问题的最优解又可以看作原问题最优解,再次使用上述公式求得。

(有了这个等式之后我们再去理解一下,我说的贪心选择性质:当前的局部最优选择可以构成该问题的最优解。回想一下我们证明贪心选择性质时的方法,我们就是证明了当前问题的最优解是由贪心选择开始的,然后又说明子问题是类似的,都是由贪心选择开始的。然后他又满足最优子结构性质,这样就可以把公式原问题最优解=这一步的局部最优解+选择完之后子问题的最优解。化为原问题最优解=这一步的局部最优解+选择完之后子问题的局部最优解+子问题选择完局部最优解之后剩下的子问题的最优解(即该子问题的子问题的最优解)。 它可以一直化简下去直到没有子问题,这样我们发现我们每一次都是选择的局部最优解最后构成整体的最优解。可见我们获得了正确答案,这样我对于贪心选择性质的定义的猜想也就加以证明了)

2.第二种证明方法(数学归纳证明,采用强归纳法)

————未完待续————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/153982.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

完整时间线!李开复Yi大模型套壳争议;第二届AI故事大赛;AI算命GPTs;LLM应用全栈开发笔记;GPT-5提上日程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 李开复「零一万物」大模型陷套壳争议&#xff0c;事件时间线完整梳理 https://huggingface.co/01-ai/Yi-34B/discussions/11#65531458…

振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(1)

注解目录 1、倾斜传感器的那些基础干货 1.1 典型应用场景 &#xff08;危楼、边坡、古建筑都是对倾斜敏感的。&#xff09; 1.2 倾斜传感器的原理 1.2.1 滚珠式倾斜开关 1.2.2 加速度式倾斜传感器 1)直接输出倾角 2)加速度计算倾角 3)倾角精度的提高 &#xff08;如果…

Kettle工具使用小结1

1.背景 客户数据库限定为tidb数据库&#xff0c;相关业务数据均存储在内。因为tidb数据库是分布式的&#xff0c;且不支持存储过程、job等功能&#xff0c;需要通过外部工具进行脚本批量处理&#xff0c;所以这里引入kettle进行脚本批量执行和作业调度。 2.环境信息 &#xf…

SpringBoot配置数据库密码加密的方法

由于系统安全的考虑,配置文件中不能出现明文密码的问题,本文就给大家详细介绍下springboot配置数据库密码加密的方法,下面话不多说了,来一起看看详细的介绍吧,需要的朋友可以参考下 1.导入依赖 <!--数据库密码加密--> <dependency><groupId>com.github.uli…

探索arkui(2)--- 布局(列表)--- 2(支持分组/实现响应滚动位置)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

Leetcode88 合并两个有序数组

合并两个有序数组 题解1 正向(记得插1删1)题解2 逆向 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减…

WEB 自动化神器 TestCafe(一)—安装和入门篇

今天小编给大家带来WEB 自动化神器 TestCafe(一) —安装和入门篇 一、TestCafe 介绍&#xff1a; TestCafe 是一款基于 Node.js 的端到端 Web 自动化测试框架&#xff0c;支持 TypeScript 或 JavaScript 来编写测试用例&#xff0c;运行用例&#xff0c;并生成自动化测试报告。…

传输层——— UDP协议

文章目录 一.传输层1.再谈端口号2.端口号范围划分3.认识知名端口号4.两个问题5.netstat与iostat6.pidof 二.UDP协议1.UDP协议格式2.UDP协议的特点3.面向数据报4.UDP的缓冲区5.UDP使用注意事项6.基于UDP的应用层协议 一.传输层 在学习HTTP等应用层协议时&#xff0c;为了便于理…

计算机网络的发展

目录 一、计算机网络发展的四个阶段 1、第一阶段&#xff1a;面向终端的计算机网络&#xff08;20世纪50年代&#xff09; 2、第二阶段&#xff1a;计算机—计算机网络&#xff08;20世纪60年代&#xff09; 3、第三阶段&#xff1a;开放式标准化网络&#xff08;20世纪70年…

vue3别名配置(vite)

1、配置别名的优点&#xff1a; 在VUE项目中import导入文件时&#xff0c;可以写相对路径. 2、在vite.config.js中配置 a. 首先引入path import path from "path"/* */ b.在resolve添加别名&#xff0c;例如&#xff1a; alias:{"~":path.resolve(__di…

jQuery【jQuery树遍历、jQuery动画(一)、jQuery动画(二)】(四)-全面详解(学习总结---从入门到深化)

目录 jQuery树遍历 jQuery动画(一) jQuery动画(二) jQuery树遍历 1、 .children() 获得子元素&#xff0c;可以传递一个选择器参数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-…

批量处理文件夹及子文件夹下文件名

从此烟雨落京城&#xff0c;一人撑伞两人行。 问题描述 下载的资源被打过标记&#xff0c;不能直接使用&#xff0c;甚是痛苦 问题&#xff1a; 所有文件的文件名都加入了【更多it教程 微信号&#xff1a;…】字段&#xff0c;包括当前文件夹和子文件夹的全部文件&#xff0c…

leetcode:链表的中间结点

1.题目描述 题目链接&#xff1a;876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 我们先看题目描述&#xff1a; 2.解题思路 我们用画图用快慢指针来解决这个问题 定义一个快指针fast&#xff0c;一个慢指针slow 快指针一次走两个结点&#xff0c;慢指针一次…

vscode终端npm install报错

报错如下&#xff1a; npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm ERR! code EPERM npm ERR! syscall open npm ERR! errno -4048…

【AI视野·今日Sound 声学论文速览 第三十四期】Thu, 26 Oct 2023

AI视野今日CS.Sound 声学论文速览 Thu, 26 Oct 2023 Totally 9 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Dynamic Processing Neural Network Architecture For Hearing Loss Compensation Authors Szymon Drgas, Lars Bramsl w, Archontis Poli…

LeetCode(21)反转字符串中的单词【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 151. 反转字符串中的单词 1.题目 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单…

Java实现俄罗斯方块游戏

俄罗斯方块游戏本身的逻辑&#xff1a; 俄罗斯方块游戏的逻辑是比较简单的。它就类似于堆砌房子一样&#xff0c;各种各样的方地形状是不同的。但是&#xff0c;俄罗斯方块游戏的界面被等均的分为若干行和若干列&#xff0c;因此方块的本质就是占用了多少个单元。 首先来考虑…

单脉冲测角-和差比幅法

和差比幅法单脉冲测角 单脉冲测角的类型阵列接收模型和差波束构造方法和差比幅测角仿真 单脉冲测角的类型 传统的单脉冲测向方法主要有3种&#xff0c;分别是半阵法、加权法和和差比幅法。其实这3种方法都需要形成和波束和差波束&#xff0c;只是波束形成的方法不同&#xff0…

多标签页文件管理器 - Win系统

多标签页文件管理器 - Win系统 前言My Files-X Free360文件夹升级Win11 前言 Win10系统自带的文件管理器不支持多标签页功能&#xff0c;本文推荐几款多标签页文件管理器&#xff0c;可以在一个文件管理器窗口中打开多个标签页。 My Files-X Free 此文件管理器支持多标签页&…

【Qt之QWizard问题】setPixmap()设置logo、background、watermark无效不显示解决方案

问题原因&#xff1a; 使用QWizard或者QWizardPage设置像素图&#xff0c;结果设置完不显示效果。 设置示例&#xff1a; setPixmap(QWizard::WatermarkPixmap, QPixmap("xxx/xxx/xxx.png"));setPixmap(QWizard::BackgroundPixmap, QPixmap("xxx/xxx/xxx.png&…