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

一、背景

编码是信息处理的基础(重新表示信息)。
普通的编码是等长编码,例如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
 
题外话,这种使用优先队列的方法,在层次聚类里也有。

原文链接:https://www.cnblogs.com/justLittleStar/p/17322144.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据结构之哈夫曼树与哈夫曼编码 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • Python排序算法之冒泡排序

    Python排序算法之冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,比较相邻两个元素,如果它们的顺序错误就交换它们的位置。通过多次遍历,最大的元素逐渐“冒泡”到列表的末尾,从而实现排序。在本攻略中,我们将介绍如何使用Python实现冒泡排序法。 步骤1:实现冒泡排序算法 在使用Python实现冒泡排序算法之前,我们需要先了解冒泡排序的基本…

    python 2023年5月14日
    00
  • pytorch 膨胀算法实现大眼效果

    以下是关于“PyTorch膨胀算法实现大眼效果”的完整攻略: 简介 膨胀算法是一种常用的图像处理算法,它可以将图像中的物体边缘膨胀,从而使物体看起来更加突出。在本教程中,我们将介绍如何使用PyTorch实现膨胀算法,并提供两个示例说明。 实现膨胀算法 以下是使用PyTorch实现膨胀算法的代码: import torch import torch.nn.fu…

    python 2023年5月14日
    00
  • python买卖股票的最佳时机(基于贪心/蛮力算法)

    以下是关于“Python买卖股票的最佳时机”的完整攻略: 简介 买卖股票的最佳时机是一种常见的算法问题,它涉及到如何在股票市场中获得最大的利润。在本教程中,我们将介绍如何使用Python实现买卖股票的最佳时机,并提供一些示例说明。 Python买卖股票的最佳时机实现 Python中有多种算法可供选择,包括贪心算法、蛮力算法等。以下是使用贪心算法实现买卖股票的…

    python 2023年5月14日
    00
  • Python中数字以及算数运算符的相关使用

    下面是详细讲解“Python中数字以及算数运算符的相关使用”的完整攻略。 1. 数字类型 在Python中,数字类型包括整数、浮点数和复数。其中,整数是没有小数部的数字浮点数是带有小数部分的数字,而复数是由实数和数部分组成的数字。 1.1 整数 在Python中,整数类型用int表示,可以进行加、减、乘、除、模、幂等运算。 a = 10 b = 3 prin…

    python 2023年5月14日
    00
  • Oracle 11g Release (11.1) 索引底层的数据结构

    我来为您详细讲解“Oracle 11g Release (11.1) 索引底层的数据结构”的完整攻略。 索引底层数据结构简介 在Oracle数据库中,索引底层数据结构是B树(B-Tree)。B树是一种常用的多路平衡查找树,它的特点是每个节点都有多个子节点,能够自动调整高度,保持所有叶子节点到根节点的距离相等。在B树中,每个节点都有一个关键字列表和一个指向子节…

    数据结构 2023年5月17日
    00
  • python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

    Python实现鸢尾花三种聚类算法(K-means, AGNES, DBScan) 1. 简介 聚类是一种无监督学习算法,它将相似的数据点分组到同一个簇中。本文将介绍如何使用Python实现三种聚类算法:K-means、AGNES和DBScan,并使用鸢尾花数据集进行演示。 2. 数据集 我们将使用鸢尾花数据集来演示如何使用聚类算法。该数据集包含150个样本…

    python 2023年5月14日
    00
  • C语言数据结构中约瑟夫环问题探究

    C语言数据结构中约瑟夫环问题探究 什么是约瑟夫环问题? 约瑟夫环问题(Josephus problem)是一个经典的问题,据说是Flavius Josephus发现并命名的。该问题描述为,编号从1到n的n个人按照顺时针方向围坐成一圈,每人持有一个密码。从第1个人开始,顺时针方向每次完整的数m个人,然后让这m个人出圈并把他们的密码拿走不算。当到达队尾时,又从队…

    数据结构 2023年5月17日
    00
  • C语言详解数据结构与算法中枚举和模拟及排序

    我们一步步来详细讲解“C语言详解数据结构与算法中枚举和模拟及排序”的完整攻略。 纲要 本文的主要内容包括: 枚举的概念及应用 模拟的概念及应用 排序的概念及分类 枚举的概念及应用 枚举是一种数据类型,可以将一组具有相关性质的常量定义为枚举常量。枚举常量默认是按照自然数递增的顺序进行编号的。枚举常量可以用于表示状态、类型、结果等概念。以下是一个枚举类型的定义:…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部