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

这篇具有很好参考价值的文章主要介绍了数据结构之哈夫曼树与哈夫曼编码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

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

二、哈夫曼树

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

  文章来源地址https://www.toymoban.com/news/detail-414602.html

哈夫曼树的特点
  • 没有度为1的结点;
  • 哈夫曼树的任意非叶节点的左右子树交换后仍是哈夫曼树;
  • n个叶子结点的哈夫曼树共有2n-1个结点;
对同一组权值{w1 ,w2, …… , wn},是否存在不同构的两棵哈夫曼树呢?存在,当存在相同权值的根节点时。
对一组权值{ 1, 2 , 3, 3 }},不同构的两棵哈夫曼树:
数据结构之哈夫曼树与哈夫曼编码
哈夫曼编码
给定一段字符串,如何对字符进行编码,使得该字符串的编码存储空间最少?
[例] 假设有一段文本,包含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
数据结构之哈夫曼树与哈夫曼编码
〖例〗哈夫曼编码
数据结构之哈夫曼树与哈夫曼编码
 
题外话,这种使用优先队列的方法,在层次聚类里也有。

到了这里,关于数据结构之哈夫曼树与哈夫曼编码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【数据结构】实验十:哈夫曼编码

    【数据结构】实验十:哈夫曼编码

    实验十 哈夫曼编码 一、实验目的与要求 1 )掌握树、森林与二叉树的转换; 2 )掌握哈夫曼树和哈夫曼编码算法的实现; 二、 实验内容 1.  请编程实现如图所示的树转化为二叉树。 2.  编程实现一个哈夫曼编码系统,系统功能包括: (1)  字符信息统计:读取待编码的源文

    2024年02月15日
    浏览(9)
  • (数据结构)哈夫曼编码实现(C语言)

    哈夫曼的编码:从一堆数组当中取出来最小的两个值,按照左下右大的进行绘制,将两个权值之和,放入队列当中,然后再进行取出两个小的,以此类推,直到全部结束,在根据图根节点,到叶子节点,每一个分支来得出编码,向左0,向右1,即可得到一个结果。

    2024年02月16日
    浏览(11)
  • 【数据结构--哈夫曼编码(C语言版)】

    【数据结构--哈夫曼编码(C语言版)】

    哈夫曼树 介绍哈夫曼树前先介绍下面几个名词: 1. 结点的路径长度 l 从根结点到该结点的路径上分支的数目 ,如下图结点 a 的 l = 3 。 2. 树的路径长度 树中所有叶子结点的路径长度之和 ,如下图该树的路径长度为 2 + 3 + 3 + 2 + 2 。 3. 结点的权 w 给每一个结点赋予一个新的数

    2024年02月04日
    浏览(20)
  • C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

    C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

    本篇实验代码非本人写,代码源自外部,经调试解决了部分warning和error后在本地vs上可以正常运行,如有运行失败可换至vs 未来会重构实现该两个实验 内容要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树 2、建立编码

    2024年02月13日
    浏览(37)
  • 【数据结构与算法】哈夫曼编码(最优二叉树)实现

    【数据结构与算法】哈夫曼编码(最优二叉树)实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(10)
  • 【数据结构与算法】哈夫曼编码(最优二叉树实现

    【数据结构与算法】哈夫曼编码(最优二叉树实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(11)
  • 哈夫曼树与哈夫曼编码及等长编码

    哈夫曼树与哈夫曼编码及等长编码

    哈夫曼树的构造:就是将给定的数据中选择最小的两个权值进行合并,然后重复该操作,构造出一个 二叉树。使其带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。 例如:给定几个数值:0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.01 可以将其扩大一百倍,以方便计

    2024年02月06日
    浏览(10)
  • 哈夫曼树与哈夫曼编码

    哈夫曼树与哈夫曼编码

    哈夫曼树:结点中赋予一个某种意义的值,称为结点的权值,从根结点开始,到目标结点经过的边数,称为路径长度,路径长度乘以权值,称为带权路径长度; 例如:根结点代表着快递集散点,一个叶子结点权值是5,在业务逻辑中代表着重量是5斤的货物📦,路径长度是3,

    2024年02月05日
    浏览(16)
  • 数据结构 实验17:Huffman树和Huffman编码——学习理解哈夫曼树

    数据结构 实验17:Huffman树和Huffman编码——学习理解哈夫曼树

    目录 前言 实验要求 算法描述 个人想法 代码实现和思路、知识点讲解 知识点讲解 文件传输 Huffman树的存储 Huffman的构造  Huffman编码 编码和译码 代码实现 文件写入和输出 Huffman树初始化 构造Huffman树 求带权路径长度 Huffman编码 Huffman译码 结束 代码测试 测试结果 利用Huffman编

    2024年02月03日
    浏览(20)
  • 数据结构【哈夫曼树】

    数据结构【哈夫曼树】

    最优二叉树也称哈夫曼 (Huffman) 树 ,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。权值是指一个与特定结点相关的数值。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 涉及到的几个概念: 路径: 从树中一个结点到另一个结

    2024年02月14日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包