第一部分 --- 哈夫曼树的基本概念

对一个判断树的判断次序进行改变后判断的总次数就可能截然不同

如上图,在面对一万个数据的时候,左边的判断树的判断总次数为22000次,右边的判断树的判断总次数为31500次,效率高了接近三分之一

效率最高的判别树又称为最优二叉树(哈夫曼树)-

1.从树的根结点到树中的每一个结点的路径长度之和等于树的路径长度

2.关键点来了:完全二叉树是结点数目相同的二叉树中,路径长度最短的二叉树,但这只是一个充分条件,有完全二叉树就有这个条件,但是没有完全二叉树不一定没有这个条件(不满足必要性)

1.最优树这个最优是在度相同的树中比较出来的,比如最优二叉树,最优三叉树等等,而二叉树和三叉树这种度不相同的树之间是无法比较出最优的

在相同度的树中,最优树可能有多个

1.注意:树的带权路径长度是树的所有叶子的带权路径长度之和

2.上面最后一点的意思是具有相同带权结点的最优树(哈夫曼树)不唯一


第二部分 --- 哈夫曼树的构造算法

先用权重小叶子构造二叉树,然后再用权重大的叶子构造二叉树,保证权重大的叶子离根近,权重小的叶子离根远

1.右边蓝色框的结论可由哈夫曼树的构造过程来解释:由于我们是“选用两小造新树”,所以新树的根结点有且只有两个子树(度数为2)


第三部分 --- 哈夫曼树构造算法的实现

1.用顺序表存储哈夫曼树的时候我们需要一个一维结构数组(数组中的元素是结构体)

2.这个结构体元素中包含四个部分:结点的权重,结点的双亲结点在数组中的下标,结点的左孩子在数组中的下标和右孩子在数组中的下标

我们创建的用来存储哈夫曼树的数组的大小为2n,数组中下标为0的位置不使用,我们从下标为1的位置开始存储元素。

1.第一步将所有已知权重的结点存到顺序表中(构建所有树都是根结点的森林)

2.第二步在没有双亲结点的结点中选择权重最小的两个结点,构造二叉树。

将这个二叉树的根结点(根结点的权重值是选择的两个结点的权重值之和)存储到数组中

3.将选择的两个结点的双亲结点下标从0改为我们新存入的结点在数组中的下标,以及将我们存入到数组中的结点的左右孩子下标由0分别改为我们选择的两个结点在数组中的下标

4.重复2,3步,直到数组中下标为2n - 1的位置也存储了元素为止


第四部分 --- 哈夫曼树的应用

1.怎样编码才能够使得不等长编码即是前缀编码,且还让编码总长度最短呢?

答案就是哈夫曼编码 --- 哈夫曼编码是左分支为0,右分支为1

1.如果非等长编码是前缀编码的话,就表示不存在字符A的编码是另一个字符B的编码的前缀,反映到树中就是当我们在到达字符B对应的结点的时候一定不会先经过字符A对应的结点,而当我们将要编码的字符作为哈夫曼树的叶子结点时,就符合这个条件

所以通过哈夫曼树得到的哈夫曼编码一定是前缀编码(通过其它树也是一样,只要保证要编码的字符是树的叶子结点就可以)

2.哈夫曼树是同结点的树中,带权路径长度最小的树,而总编码次数 = 总字符数 *(字符出现的频率(权)* 字符的编码长度) = 总字符数 * 树的带权路径长度,总字符数是个常量,而我们通过哈夫曼树得到的则是在同结点的树中的带权路径长度的最小值

1.存储哈夫曼树的数组中的最后一位置存储的一定是哈夫曼树的根结点

2.哈夫曼编码的算法实现是通过栈来实现的,具体步骤:

一.从我们要找编码的字符对应的叶子结点开始往上找,首先找到叶子结点的双亲结点

二.判断叶子结点是双亲结点的左孩子还是右孩子 --- 左孩子则将0入栈,右孩子则将1入栈

三.找双亲结点的双亲结点,并重复第二步

四.重复二,三步直到出现双亲结点为空时停止寻找(到达根结点了)

五.将栈中元素出栈,出栈后得到的编码就是我们的字符要找的编码

(哈夫曼树关于文件的编码和解码的应用)

1.指导改为直到

根据给定的字符频度表构造哈夫曼树,然后再通过上面的步骤将进行过编码步骤的文件进行解码

算法与数据结构 --- 哈夫曼树及其应用相关推荐

  1. 【数据结构——哈夫曼树及其应用】

    [数据结构--哈夫曼树及其应用] 一.哈夫曼树的基本概念 二.哈夫曼树的构造算法 (一)哈夫曼树的构造过程 (二)哈夫曼树构造算法的实现 1.初始化 2.创建树 3.完整的创建哈夫曼树代码 三.哈夫曼 ...

  2. 数据结构--赫夫曼树

    数据结构 –赫夫曼树 文章目录 数据结构 一.一些概念 二.最优二叉树(赫夫曼树) 三.赫夫曼树的构造 四.赫夫曼编码 五.前缀编码 一.一些概念 路径:从树中一个结点到另一个结点之间的分支构成这两个 ...

  3. 数据结构---哈夫曼树

    数据结构-哈夫曼树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 100 #define INF ...

  4. 数据结构哈夫曼树实现26个英文字符的编码和译码

    数据结构哈夫曼树实现26英文字符的编码和译码 那么首先什么是哈夫曼树?(知道的略过,直奔下面代码就好!) 在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编 ...

  5. 霍夫曼算法,构造霍夫曼树 (C++)

    //霍夫曼算法,构造霍夫曼树 #include <iostream> using namespace std; #define MAXSIZE 16 struct HaffNode {   ...

  6. 【数据结构与算法基础】哈夫曼树与哈夫曼编码(C++)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  7. 【数据结构和算法笔记】哈夫曼树的概念,构造和应用(利用哈夫曼编码压缩文本)

    目录 哈夫曼树定义: 构造哈夫曼树: 哈夫曼编码 前缀编码: 应用(压缩文本) 哈夫曼树定义: 构造哈夫曼树: 哈夫曼编码 前缀编码:  哈夫曼编码是前缀编码 哈夫曼树的性质 哈夫曼树的任意非叶结点的 ...

  8. 一步一步写算法(之哈夫曼树 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到了哈夫曼树的创建,那下面一个重要的环节就是哈夫曼树的排序问题.但是由于排序的内容是数据 ...

  9. 数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现

    什么是哈夫曼树 哈夫曼树就是一种最优判定树,举个例子,如下一个判断逻辑 if(s<60) g=1; else if(s<70) g=2 else if(s<80) g=3 else ...

最新文章

  1. 【蓝桥java】递归基础之39级台阶
  2. SAP MM PR 审批中的REJECT
  3. Windows下关闭占用指定端口应用程序的方法
  4. 【练习】使用事务控制语句
  5. servlet设置cookie实验
  6. VS2012程序打包部署详解
  7. 20145201 20145227 《信息安全系统设计基础》实验二 固件开发
  8. 【MySQL】Linux 命令启动 mysql
  9. Python列表和元组比较
  10. jmp软件(jMP软件正交设计交互作用)
  11. 【ubuntu如何录制gif图】
  12. 软考系统架构设计师学习笔记
  13. 服务器数据恢复的两种方法
  14. Android 11.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果
  15. 转载和积累系列 - linux 生成KEY的方法与使用
  16. wifi认证取消html查看器,wifi网页认证怎么设置
  17. 押宝ACE平台 北电自救或转身服务型公司
  18. 智能微模块一体化机柜
  19. AutoIt 对于文件的操作
  20. 对数函数定义域和值域为r_对数函数值域为R的意义

热门文章

  1. 为了探究妹纸对内衣的喜好,我爬了淘宝内衣店的数据!
  2. STM32F407的时钟
  3. Redis7.0的安装步骤
  4. android stuio修改代码参考线和智能换行
  5. 谈老人机却不是老人机
  6. Android Activity向右滑动返回
  7. MODTRAN辐射传输模型使用笔记
  8. 少儿编程入门001,在家自己带孩子学编程
  9. 利用photoshop去掉图片中文字
  10. 无法将maven 编译部署src/main/java下的资源文件