全部数据结构、算法及应用课内模板请点击:https://blog.csdn.net/weixin_44077863/article/details/101691360

Huffman树的要求是n个外部结点的扩充二叉树且WPL最小

这个扩充二叉树不是扩充空叶子,而是扩充空根,给的n个结点是原来说的空叶子

WPL  = ∑ wi*li,WPL指的是叶子结点带权路径长度总和,是点权乘以到根距离的总和

算法实现的想法很简单

①权越大要离根要越近,权越小离根要越远

②叶子结点向上找根,没向上走一次,这个点权就加一次,于是两个结点的点权加在一起合成到根上,继续向上加就直接算这个根就好,也就是可以利用这样一个根结点去继续做合成

于是实现时非常简单

一堆点

取两个最小的合成一棵子树,根结点值为儿子结点值之和,把这个子树再放回那堆点中

可以把这个子树的根结点看做这堆点中的一个点去和其他点做判断

还是选出两个合一下,反复做这样的操作,直到合出一棵完整的树

举例如下

然后讲一讲Huffman树的应用,就是用于电文加密方面,用二进制数去表示一个字母

使得表示出来的既没有歧义,又是最短的

然后方法很简单按频率来构建Huffman树即可,然后我们常用的是左0右1去把对应字母的二进制串写出来,很简单,看个例子吧

这里我们给出Huffman树的建树模板代码,其余的基本操作就不写了

有一点忘说了,就是注意n个结点需要n-1次子树的合并,很好理解,就不多说了

template <class T>
class Node{
public:T x;Node<T> *l,*r,*pa;Node():l(0),r(0),pa(0){}Node(T x,Node<T> *l=0,Node<T> *r=0,Node<T> *pa=0):x(x),l(l),r(r),pa(pa){}
};
template <class T>
class cmp{//注意如果堆里是对指针排序的话,Node里重载小于号就不好用了,你就必须得写cmp了
public:bool operator()(Node<T> *a,Node<T> *b){return a->x>b->x;}
};
template <class T>
class HuffmanTree
{
private:Node<T>* root;                               //Huffman树的树根
public: HuffmanTree(T w[], int n);void merge(Node<T> *a,Node<T> *b,Node<T>* pa);
};
template<class T>
void HuffmanTree<T>::merge(Node<T> *a,Node<T> *b,Node<T>* pa){pa->x=a->x+b->x;pa->l=a;pa->r=b;a->pa=pa;b->pa=pa;
}
template<class T>
HuffmanTree<T>::HuffmanTree(T w[], int n){priority_queue<Node<T>*,vector<Node<T>*>,cmp<T>> q;Node<T> *pa,*a,*b,*tmp;for(int i=0;i<n;i++){tmp=new Node<T>(w[i]);q.push(tmp);}for(int i=0;i<n-1;i++){a=new Node<T>;b=new Node<T>;pa=new Node<T>;a=q.top();q.pop();b=q.top();q.pop();merge(a,b,pa);q.push(pa);root=pa;}
}

Huffman编码树相关推荐

  1. 百练4080:Huffman编码树

    BaiLian4080 Huffman编码树 解题思路 所求即为最短路径之和, 也等于新生成节点频率之和.所以可以使用优先队列每次获取一个最小值和次小值, 所求之和即为新生成节点的频率-再依次获取即可 ...

  2. 数据压缩 实验三 Huffman编解码算法实现与压缩效率分析

    实验目的 掌握Huffman编解码实现的数据结构和实现框架, 进一步熟练使用C编程语言, 并完成压缩效率的分析. 实验原理 1.本实验中Huffman编码算法 (1)将文件以ASCII字符流的形式读入 ...

  3. Huffman编解码

    Huffman编解码算法实现与压缩效率分析 一.背景知识及相关公式 1.信源熵 信源熵是信息的度量单位,一般用H表示,单位是比特,对于任意一个随机变量,它的熵定义为,变量的不确定性越大,熵也就越大. ...

  4. JPEG 标准推荐的亮度、色度DC、AC Huffman 编码表

    JPEG 标准推荐的亮度.色度DC.AC Huffman 编码表 博主在完成数字图像处理大作业时利用搜索引擎查找了很久完整的四张Huffman 编码表(亮度AC Huffman编码表.亮度DC Huf ...

  5. 多媒体技术与应用之图像Huffman编解码

    多媒体技术与应用之图像Huffman编解码 一.实验内容 1.了解BMP图像的格式,实现BMP图片格式的数据域及文件头的分离 2.熟悉Huffman编码原理 3.使用Huffman编码算法对给定图像文 ...

  6. 实验三 Huffman编解码算法实现与压缩效率分析

    一.Huffman编解码原理 1. Huffman编码 对原始文件进行Huffman编码,首先需要解决以下几点问题: 文件符号的概率分布情况是怎样的? Huffman树是如何建立的? 建立起Huffm ...

  7. Huffman编解码完全注释

    Huffman编解码完全注释 /** huffman - Encode/Decode files using Huffman encoding.* Copyright (C) 2003 Douglas ...

  8. JPEG标准推荐的亮度、色度DC、AC Huffman编码表

    JPEG 标准推荐的亮度.色度DC.AC Huffman 编码表 博主在完成数字图像处理大作业时利用搜索引擎查找了很久完整的四张Huffman 编码表(亮度AC Huffman编码表.亮度DC Huf ...

  9. 数据压缩原理 实验三 Huffman编解码算法实现与压缩效率分析

    实验原理 Huffman编码是一种无失真编码方式,是一种可变长编码,它将出现概率大的信源符号短编码,出现概率小的信源符号长编码. 编码步骤: ①将文件以ASCII字符流的形式读入,统计每个符号的发生概 ...

最新文章

  1. java合并两个doc文件,java实现合并2个文件中的内容到新文件中
  2. Java synchronized 和 volatile 的区别
  3. 58 第一个工程项目(Celery)
  4. WARNING: at net/core/dev.c:1905 skb_warn_bad_offload+0x94/0xb4() 解决思路
  5. 如何为Oracle配置多个监听器
  6. ‘vagrant up’ fails to mount linked directory /vagrant
  7. 基于Apache POI 从xlsx读出数据
  8. linux平台设备驱动模型是什么意思,Linux设备驱动模型之我理解
  9. java webservice用户验证_java webservice 用户验证 (服务端 + 客户端)
  10. 物联网操作系统 - Contiki
  11. 基于51单片机的温湿度监测+定时报警系统(c51源码)
  12. 学到了林海峰,武沛齐讲的Day16完
  13. oracle同义词表不存在,同义词什么时候失效呢?
  14. 高流明投影仪品牌,这份投影仪行业数据告诉你答案
  15. 通过Bottledwater同步PostgreSQL中的数据变化到Kafka消息队列
  16. linux内核抢占加锁,linux内核的preempt抢占调度,preempt_count抢占保护“锁”
  17. linux系统出现BUG:softlockup- CPU#0 STUCK FOR 23s 或 rcu_sched self-detected stall on cpu 等字样的解决办法
  18. web service 优缺点
  19. 家用NAS安装大礼包:PVE+OMV+常用soft详细安装教程
  20. Xdelta3 bsdiff Courgette三种差分算法比较

热门文章

  1. git使用总结(持续更新,个人总结记录使用)
  2. svn:Cannot negotiate authentication mechanism
  3. Yii和ThinkPHP对比心得
  4. HDU 4870 Rating(高斯消元 )
  5. 如何查看IIS的80端口被占用?
  6. DataGridView下拉框动态赋值以及事件处理
  7. php+高德地图webapi 高德jsapi 实现 当前位置与目标位置距离 并按照距离排序(坐标逆转换)...
  8. git不区分文件名大小写这种坑当然要跳出来
  9. 如何为属性是disabled的表单绑定js事件
  10. css 实现居中的五种方式