首页 > 其他分享 >数据结构之哈夫曼树与哈夫曼编码

数据结构之哈夫曼树与哈夫曼编码

时间:2023-04-15 22:58:25浏览次数:24  
标签:编码 结点 Weight 哈夫曼 字符 权值 数据结构

一、背景

编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。但其在传输和存储等情况下编码效率不高。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例] 将百分制的考试成绩转换成五分制的成绩 0 按顺序分别编码。 0 按频率分别编码(高频短编码,类似于香农熵衡量随机变量的编码长度下界)。 这种贪心思想,可以找到一种平均最短编码长度-霍夫曼编码。可将构造平均最短编码转化为,构造平均查找长度最小的编码树(构造更有效的搜索树)

二、哈夫曼树

哈夫曼树的定义 0 带权路径长度就是所有叶子节点的编码长度乘以权重的和。 希望权重越高的叶子节点,编码长度越小。 [例] 有五个叶子结点,它们的权值为{1,2,3,4,5},用此权值序列可以构造出形状不同的多个二叉树。 0 哈夫曼树的构造 初始全是只有一个节点的树构成的森林 (优先队列存放树的根节点,每次合并后将新的树插入队列) 0 每次把权值最小的两棵二叉树合并 (自底向上)   使用最小堆,Huffman树为二叉树
typedef struct TreeNode *HuffmanTree;
struct TreeNode{
    int Weight;
    HuffmanTree Left, Right;
};

/* WPL WeightPathLength Cost越小编码越有效, O(NlogN) */ 
HuffmanTree Huffman( MinHeap H )
{ 
  /* 假设H->Size个权值已经存在H->Elements[]->Weight里 */
    int i; 
    HuffmanTree T;
    BuildMinHeap(H); /* 将H->Elements[]按权值调整为最小堆 */
    /* 做 H->Size - 1 次合并 */
    for (i = 1; i < H->Size; i++) 
{ 
         T = malloc( sizeof( struct TreeNode) ); /* 建立新结点 */        
         T->Left = DeleteMin(H);  /* 从最小堆中删除一个结点,作为新T的左子结点 */
         
         T->Right = DeleteMin(H);
 /* 从最小堆中删除一个结点,作为新T的右子结点 */        
         T->Weight = T->Left->Weight + T->Right->Weight; /*计算新权值*/

         Insert( H, T ); /*将新T插入最小堆*/
     }
     T = DeleteMin(H);
     
    return T;


int WPL( HuffmanTree H )
{
    return H->Weight;
}

  

哈夫曼树的特点
  • 没有度为1的结点;
  • 哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树;
  • n个叶子结点的哈夫曼树共有2n-1个结点;
对同一组权值{w1 ,w2, …… , wn},是否存在不同构的两棵哈夫曼树呢?存在,当存在相同权值的根节点时。 对一组权值{ 1, 2 , 3, 3 }},不同构的两棵哈夫曼树: 0 哈夫曼编码 给定一段字符串,如何对字符进行编码,使得该字符串的编码存储空间最少? [例] 假设有一段文本,包含58个字符,并由以下7个字符构:a,e,i, s,t,空格(sp),换行(nl);这7个字符出现的次数不同。如何对这7个字符进行编码,使得总编码空间最少? [分析] (1)用等长ASCII编码:58 ×8 = 464位; (2)用等长3位编码:58 ×3 = 174位; (3)不等长编码:出现频率高的字符用的编码短些,出现频率低的字符则可以编码长些?   怎么进行不等长编码?如何避免二义性?
  • 前缀码prefix code:任何字符的编码,都不是另一字符编码的前缀
可以无二义地解码(判定字符是否都在叶结点上,没有字符在路径上,不然解码时会有歧义)   用二叉树进行编码:1)左右分支:0、1; 2)字符只在叶结点上 [例] 四个字符的频率: a:4, u:1, x:2, z:1 0 〖例〗哈夫曼编码 0   题外话,这种使用优先队列的方法,在层次聚类里也有。

标签:编码,结点,Weight,哈夫曼,字符,权值,数据结构
From: https://www.cnblogs.com/justLittleStar/p/17322144.html

相关文章

  • SpringMVC中的字符编码问题
    字符编码问题目录字符编码问题一、背景二、排查思路2.1、查看idea默认编码方式2.2、查看接口代码2.3、查看linux编码三、解决思路3.1、修改远程调用编码四、SpringMVC对字符编码的配置4.1、字符编码自动配置类HttpEncodingAutoConfiguration4.2、配置类中属性说明4.3、过滤器中设......
  • 数据结构-->二叉树_02
    今天,接着上一期的博文,继续推进!!请看下面的的代码:>求一棵树的高度,为何需要存储起来呢?解答这个问题之前,需要稍微改动一下,上述的代码!会发现上述代码有很大的好处!//二叉树的高度intTreeHight(BTNode*root){ if(root==NULL){ return0;}returnTreeHight(root->l......
  • 【数据结构】二叉树的基本操作与遍历(C语言)
     目录定义满二叉树 完全二叉树性质应用计算二叉树结点个数 计算叶子结点的个数第 k层结点的个数查找值为x的节点遍历前序遍历中序遍历后序遍历层序遍历判断是否为完全二叉树定义......
  • 阳间数据结构学习笔记
    \[\text{orzlxlsto}\]CodechefDGCD(Weaker)/AcWing246给定一个长度为\(n\)的数列\(A=(a_1,a_2,\dots,a_n)\),支持两种操作:CLRd:将\(a_L,a_{L+1},\dots,a_R\)都加上\(d\)。QLR:查询\(\gcd(a_L,a_{L+1},\dots,a_R)\)。\(1\leqn\leq50......
  • 25-组合逻辑集成电路-编码器
    编码器组合逻辑集成电路(MSI)组合电路使用小规模电路设计,描述清楚,用小规模的集成电路实现;小规模集成电路比较灵活常用的部件(译码器\编码器\比较器\选择器)都是事先做好,直接进行使用1.编码器概念及分类1.1编码器的概念编码器:使用一组二进制数表示一个数值或者是符号。例......
  • cadical基本数据结构01
    以下代码基于cadical-rel-1.5.3版本,来源于: Solver在cadical.hpp文件中声明求解器类型。其中成员函数比较有趣的是:intval(intlit);//Line25,返回文字的正负性;assert(val(liter)),断言文字liter为非零,即是有效文字;boolfailed(intlit);//Determinewhetherth......
  • c++基本数据结构
    基本数据结构:一.线性表1.顺序结构线性表可以用普通的一维数组存储。你可以让线性表可以完成以下操作(代码实现很简单,这里不再赘述):返回元素个数。判断线性表是否为空。得到位置为p的元素。查找某个元素。插入、删除某个元素:务必谨慎使用,因为它们涉及大量元素的移动。......
  • m基于matlab的图像方块编码仿真,输出编码后PSNR图像质量指标
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要BTC编码又称方块编码,是一种有效,快速,简单的有损灰度图像数字压缩技术,具有性能高,信道容错力高等特点,在实时图像传输方面具有很高的应用价值,由美国普渡大学的Mitchell和Delphi教授提出.使用Mat-lab实现BTC编码......
  • m基于matlab的图像方块编码仿真,输出编码后PSNR图像质量指标
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要       BTC编码又称方块编码,是一种有效,快速,简单的有损灰度图像数字压缩技术,具有性能高,信道容错力高等特点,在实时图像传输方面具有很高的应用价值,由美国普渡大学的Mitchell和Delphi教授提......
  • 总结与归纳之数据结构
    (开一个大坑)前言总论正文基础数据结构栈队列链表数据哈希(这也基础?)并查集传统+基础变种并查集可持久化并查集单调栈/队列ST表树状数组线段树传统线段树李超线段树segbeats主席树动态开点与标记永久化线段树分裂与合并线段树分治平衡树传统平衡树可持久化......