Python算法之哈夫曼编码

Python015

Python算法之哈夫曼编码,第1张

问题: 哈夫曼编码,英文名称 Huffman Coding,有时也翻译为霍夫曼编码,在1952年提出的,是最好的编码方式。哈夫曼编码在电子通讯方面有着重要的应用,同时也广泛应用于数据压缩,其压缩率通常在20% 90%之间 赫夫曼码是可变字长编码(VLC)的一种。哈夫曼树是最优二叉树, 带权路径长度最小的二叉树。

原理:

假设有几个数字40,10,20,16,14。

首先将这五个数字按照从小到大的顺序排列:10, 14,16,20, 40。

构建哈夫曼树:

1.首先选取10,14

2.重新排序:16,20,24,40

3.重新排序24,36,40,60

4.按照二叉树左0右1,构建哈夫曼树

所以最终得到数字10的编码为100,数字14的编码为101,数字16的编码为110,数字20的编码为111,数字40的编码为0。

代码:

运行结果:

研究信息传输过程中信号编码规律的数学理论。编码理论与信息论、数理统计、概率论、随机过程、线性代数、近世代数、数论、有限几何和组合分析等学科有密切关系,已成为应用数学的一个分支。编码是指为了达到某种目的而对信号进行的一种变换。其逆变换称为译码或解码。 根据编码的目的不同,编码理论有三个分支:

信源编码。对信源输出的信号进行变换,包括连续信号的离散化,即将模拟信号通过采样和量化变成数字信号,以及对数据进行压缩,提高数字信号传输的有效性而进行的编码。

信道编码。对信源编码器输出的信号进行再变换,包括区分通路、适应信道条件和提高通信可靠性而进行的编码。

③保密编码。对信道编码器输出的信号进行再变换,即为了使信息在传输过程中不易被人窃取而进行的编码。编码理论在数字化遥测遥控系统、电气通信、数字通信、图像通信、卫星通信、深空通信、计算技术、数据处理、图像处理、自动控制、人工智能和模式识别等方面都有广泛的应用。 前向纠错(英语:Forward error correction,缩写FEC)是一种在单向通信系统中控制传输错误的技术,通过连同数据发送额外的信息进行错误恢复,以降低误码率(bit error rate,BER)。FEC又分为带内FEC和带外FEC。FEC的处理往往发生在早期阶段处理后的数字信号是第一次收到。也就是说,纠错电路往往是不可分区的一部分的模拟到数字的转换过程中,还涉及数字调制解调,或线路编码和解码。

FEC是通过添加冗余信息的传输采用预先确定的算法。1949年汉明(Hamming)提出了可纠正单个随机差错的汉明码。1960年Hoopueghem,Bose和Chaudhum发明了BCH码,Reed与Solomon又提出 ReedSolomon(RS)编码,纠错能力很强,后来称之为里德-所罗门误码校正编码(The reed-solomon error correction code,即后来的附加的前向纠错)。ITU-T G.975/G.709规定了“带外FEC”是在SDH层下面增加一FEC层,专门处理FEC的问题。带外FEC编码冗余度大,纠错能力较强。FEC有别于ARQ,发现错误无须通知发送方重发。一旦系统丢失了原始的数据包,FEC机制可以以冗余数据包加以补入。例如有一数据包为“10”,分成二个数据包,分别为“1”和“0”,有一冗余数据包“0”,收到任意两个数据包就能组装出原始的包。但这些冗余数据包也会产生额外负担。 1843年美国著名画家S.F.B.莫尔斯精心设计出莫尔斯码,广泛应用在电报通信中。莫尔斯码使用三种不同的符号:点、划和间隔,可看作是顺序三进制码。根据编码理论可以证明,莫尔斯码与理论上可达到的极限只差15%。但是直到20世纪30~40年代才开始形成编码理论。1928年美国电信工程师H.奈奎斯特提出著名的采样定理,为连续信号离散化奠定了基础。1948年美国应用数学家C.E.香农在《通信中的数学理论》一文中提出信息熵的概念,为信源编码奠定了理论基础。1949年香农在《有噪声时的通信》一文中提出了信道容量的概念和信道编码定理,为信道编码奠定了理论基础。无噪信道编码定理(又称香农第一定理)指出,码字的平均长度只能大于或等于信源的熵。有噪信道编码定理(又称香农第二定理)则是编码存在定理。(见香农三大定理)它指出只要信息传输速率小于信道容量,就存在一类编码,使信息传输的错误概率可以任意小。随着计算技术和数字通信的发展,纠错编码和密码学得到迅速的发展。

在信源编码方面

1951年香农证明,当信源输出有冗余的消息时可通过编码改变信源的输出,使信息传输速率接近信道容量。1948年香农就提出能使信源与信道匹配的香农编码。1949年美国麻省理工学院的R.M.费诺提出费诺编码。1951年美国电信工程师D.A.哈夫曼提出更有效的哈夫曼编码。此后又出现了传真编码、图像编码和话音编码,对数据压缩进行了深入的研究,解决了数字通信中提出的许多实际问题。

在纠错编码方面

1948年香农就提出一位纠错码(码字长=7,信息码元数=4)。1949年出现三位纠错的格雷码(码字长=23,信息码元数=12)。1950年美国数学家理查德·卫斯里·汉明发表论文《检错码和纠错码》,提出著名的汉明码,对纠错编码产生了重要的影响。1955年出现卷积码。卷积码至今仍有很广泛的应用。1957年引入循环码。循环码构造简单,便于应用代数理论进行设计,也容易实现。1959年出现能纠正突发错误的哈格伯尔格码和费尔码。1959年美国的R.C.博斯和D.K.雷·乔达利与法国的A.奥昆冈几乎同时独立地发表一种著名的循环码,后来称为BCH码(即Bose-Chaudhuri-Hocquenghem码)。1965年提出序贯译码,序贯译码已用于空间通信。1967年A.J.维特比提出最大似然卷积译码,称为维特比译码。1978年出现矢量编码法。矢量编码法是一种高效率的编码技术。1980年用数论方法实现里德-所罗门码(Reed-Solomon码),简称RS码。它实际上是多进制的BCH码。这种纠错编码技术能使编码器集成电路的元件数减少一个数量级。它已在卫星通信中得到了广泛的应用。RS码和卷积码结合而构造的级连码,可用于深空通信。

在密码学方面

1949年香农发表《保密系统的通信理论》,通常它被认为是密码学的先驱性著作。1976年狄菲和赫尔曼首次提出公开密钥密码体制,为密码学的研究开辟了新的方向。超大规模集成电路和高速计算机的应用,,促进了保密编码理论的发展,同时也给保密通信的安全性带来很大的威胁。70年代以来把计算复杂性理论引入密码学,出现了所谓P类、NP类和NP完全类问题。算法的复杂性函数呈指数型增长,因此密钥空间扩大,使密码的分析和搜索面临严重的挑战。密码学开始向纵深方向发展。