首页 > 其他分享 >霍夫曼编码详解

霍夫曼编码详解

时间:2023-03-01 13:04:34浏览次数:62  
标签:编码 词组 符号 信源 详解 霍夫曼 码长

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:​​information-theory​​】,需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。

霍夫曼编码

最佳变长编码

  • 最佳码: 对于某一信源和某一码符号集来说,若有一唯一可译码,其平均码长小于所有其他唯一可译码的平均长度。
  • 紧致码
  • 香农(Shannon)
  • 费诺(Fano)
  • 霍夫曼(Huffma )

霍夫曼编码

在霍夫曼编码算法中, 固定长度的信源输出分组将映射成可变长度的二进制分组。该过程称为定长到变长编码。

其思想是将频繁出现的固定长度序列映射成较短的二进制序列, 而将出现频率较低的固定长度序列映射成较长的二进制序列。

平均码长

霍夫曼编码详解_霍夫曼编码

一种最优的信源编码方法是信源的平均码长接近或者等于信源的信息熵H(X) 。

霍夫曼编码的步骤

  1. 将信源消息符号按其出现的概率大小依次排列
  2. 霍夫曼编码详解_码字_02

  3. 取两个概率最小的字母分别配以 0 和 1 两码元, 并将这两个概率相加作为一个新字母的概率, 与未分配的二进 符号的字母重新排队。
  4. 对重排后的两个概率最小符号重复步骤(2)的过程。
  5. 不断继续上述过程,直到最后两个符号配以 0 和 1 为止
  6. 从最后一级开始,向前返回得到各个信源符号所对应的码元序列, 即相应的码字。

Example:试为如下信源设计霍夫曼编码

霍夫曼编码详解_霍夫曼编码_03

霍夫曼编码详解_编码效率_04

上例中, 平均码长为

霍夫曼编码详解_霍夫曼编码_05

霍夫曼编码的平均码长满足如下不等式

霍夫曼编码详解_编码效率_06

如果对长度为n的信源字符序列进行霍夫曼编码(信源的 n 次扩展信源) 而不是对单信源字符的编码, 则有

霍夫曼编码详解_霍夫曼编码_07

例 设单符号离散无记忆信源如下. 要求对信源编二进制霍夫曼码。


霍夫曼编码详解_霍夫曼编码_08

霍夫曼编码详解_霍夫曼编码_09


霍夫曼编码详解_码字_10

平均码长为


霍夫曼编码详解_编码效率_11

编码效率


霍夫曼编码详解_霍夫曼编码_12

霍夫曼的编法并不唯一。每次对缩减信源两个概率最小的符号分配“0”和“1”码元是任意的,所以可得到不同的码字。只要在各次缩减信源中保持码元分配的一致性,即能得到可分离码字。不同的码元分配,得到的具体码字不同,但码长霍夫曼编码详解_编码效率_13不变,平均码长也不变,所以没有本质区别;

缩减信源时,若合并后的新符号概率与其他符号概率相等,从编码方法上来说,这几个符号的次序可任意排列,编出的码都是正确的,但得到的码字不相同。

不同的编法得到的码字长度霍夫曼编码详解_编码效率_13也不尽相同。

例 单符号离散无记忆信源

霍夫曼编码详解_编码效率_15

霍夫曼编码详解_霍夫曼编码_16

单符号信源编二进制哈夫曼码,编码效率主要决定于信源熵和平均码长之比。

对相同的信源编码, 其熵是一样的, 采用不同的编法, 得到的平均码长可能不同。

平均码长越短,编码效率就越高。

编法一的平均码长为

霍夫曼编码详解_码字_17

编法二的平均码长为

霍夫曼编码详解_编码效率_18

两种编法的平均码长相同,所以编码效率相同。

哪种方法更好?

定义码字长度的方差 霍夫曼编码详解_霍夫曼编码_19:

霍夫曼编码详解_霍夫曼编码_20

第二种编码方法的码长方差要小许多。第二种编码方法的码长变化较小, 比较接近于平均码长。

第一种方法编出的5个码字有4种不同的码长;第二种方法编出的码长只有两种不同的码长;第二种编码方法更简单、更容易实现,所以更好。

结论:

在霍夫曼编码过程中,对缩减信源符号按概率由大到小的顺序重新排列时,应使合并后的新符号尽可能排在靠前的位置, 这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。

例: 一信源模型如下, 试对信源符号进行 Huffman编码, 并计算平均码长和编码效率 。若对其2次扩展信源进行编码, 结果如何

霍夫曼编码详解_编码效率_21

解: (1) 不做扩展, 进行单符号Huffuman编码时 编码结果为:

霍夫曼编码详解_霍夫曼编码_22

(2)二次扩展信源 霍夫曼编码详解_霍夫曼编码_23, 共有霍夫曼编码详解_编码效率_24个信源符号, 为

霍夫曼编码详解_编码效率_25

双应的概率为:

霍夫曼编码详解_码字_26

可得编码结果为

霍夫曼编码详解_码字_27

结论:N 越大, 编码效率越大。

某DMS信源如式:

霍夫曼编码详解_霍夫曼编码_28

, 则其二次扩展信源为


霍夫曼编码详解_码字_29

请分别对DMS信源:

霍夫曼编码详解_编码效率_30

, 及其二次扩展信源进行二进制霍夫曼编码,并计算平均码长。

DMS信源:

霍夫曼编码详解_编码效率_31

。平均码长 =1.5

扩展信源:

霍夫曼编码详解_霍夫曼编码_32

平均码长 =107 / 36; 平均每符号码长 =107 / 72=1.486;

该信源信息熵 =1.459 bit/sym。

L-Z编码

将信源序列分成一系列以前未出现而且最短的字符串或词组。如,将信源序列列1011010100010...分成1,0,11,01,010,00,10,..注意,每个词组具有如下性质:

  • 每个词组有一个前缀在前面出现过;
  • 每个词组的长度比其前缀长一个字符。
  • 对词组进行如下编码:给出前缀在词组序列中的位置号和最后一个字符的值。L-Z编码先将信源分成不等长的词组然后编码。

设c(n)为信源序列所分成的词组的个数,那么描述词组的前缀的位置需要logc(n) bit, 而词组的最后一个符号需要1bit。上例中,词组的个数为7,那么描述词组的前缀的位置需要3bit。所对应的编码序列为(000,1),(000,0)(001,1) , (010,1) ,(100,0) , (010,0),(001,0)。其中每个括号内的第一个数字表示该词组的前缀的位置序号,第二个数字是该词组的最后一个符号。

L-Z算法主要包括两步:

  1. 将序列分组,计算词组个数c(n)和描述前缀的位置需要的比特数logc(n);
  2. 对每个词组,计算前缀位置,构成码字。前缀位置的编码可以是等长码,也可以是变长码。通常在起始位置需要的位数少,而随着词组序号的增长,前缀位置的编码的位数也不断增加。L-Z编码一般用在信源序列长度较大是才有效。

总结

  • 编码的基本概念
  • 无失真信源编码:译码错误概率任意小。
  • 香农无失真信源编码定理:存在压缩编码的极限。
  • 霍夫曼编码:是一种最优的信源编码,某些信源概率分布条件下,可以达到香农信源编码的极限。

参考文献:

  1. Proakis, John G., et al. Communication systems engineering. Vol. 2. New Jersey: Prentice Hall, 1994.
  2. Proakis, John G., et al. SOLUTIONS MANUAL Communication Systems Engineering. Vol. 2. New Jersey: Prentice Hall, 1994.
  3. 周炯槃. 通信原理(第3版)[M\]. 北京:北京邮电大学出版社, 2008.
  4. 樊昌信, 曹丽娜. 通信原理(第7版) [M\]. 北京:国防工业出版社, 2012.

标签:编码,词组,符号,信源,详解,霍夫曼,码长
From: https://blog.51cto.com/u_15736437/6090250

相关文章

  • Vue,小程序开发技术详解
    目前应用最广的三大前端框架分别是Vue、React和Angular。其中,不管是BAT大厂,还是创业公司,Vue都有广泛的应用。如今,再随着移动开发小程序的蓬勃发展,Vue也广泛应用到了......
  • 以太坊中状态树(MPT树)详解
    概述以太坊中采用的是基于账户的模式,也就是说系统中显示记录着每个账户的当前状态信息。每个账户都是由一个160位的地址组成,对应的账户中的状态包含余额(balance)、交易次......
  • (笔记)EtherCat报文格式详解
     说明:本文是从EtherCat初学者的角度来撰写的,详细介绍的其报文格式,特别是应用层与Canopen之间的关系。特别感谢:https://zhuanlan.zhihu.com/p/406428272?utm_id=0的贡献。......
  • win10如何彻底关闭自带defender杀毒软件【教程详解】
    windowsdefender是win10系统自带的杀毒软件,有的时候我们需要关闭它才能运行某些软件,而网上的一些针对关闭win10自带的杀毒软件的方法似乎并没有什么效果,下面就来教大家彻......
  • ThreadLocal 详解
    ThreadLocal概述ThreadLocal类用来提供线程内部的局部变量,不同的线程之间不会相互干扰这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立......
  • 文件编码转换utf-8更改为ascii
    #!/usr/bin/python#-*-coding:UTF-8-*-"""为啥搞这个?idea设置了自动转码,settings->editor->fileEncodings->Transparentnative-to-asciiconversionpropert......
  • 推荐系统[四]:精排-详解排序算法LTR (Learning to Rank)_ poitwise, pairwise, listwis
    0.前言召回排序流程策略算法简介推荐可分为以下四个流程,分别是召回、粗排、精排以及重排:召回是源头,在某种意义上决定着整个推荐的天花板;粗排是初筛,一般不会上复杂模型......
  • Golang make和new的区别及实现原理详解
    在Go语言中,有两个比较雷同的内置函数,分别是new和make方法,二者都可以用来分配内存,那他们有什么区别呢?下面我们就从底层来分析一下二者的不同。感兴趣的小伙伴们可以参考......
  • 学习笔记288—Docker 基础技术之 Linux namespace 详解
    Docker基础技术之Linuxnamespace详解Docker是“新瓶装旧酒”的产物,依赖于Linux内核技术chroot、namespace和cgroup。本篇先来看namespace技术。Docker和虚......
  • 路飞前台全局css 全局配置文件,安装axios,安装vue-cookies,安装elementui,安装bootstrap和
    目录路飞前台全局css全局配置文件,安装axios,安装vue-cookies,安装elementui,安装bootstrap和jq,后台主页模块表设计,后台主页模块轮播图接口,录入数据,跨域问题详解昨日内容回顾......