需c++huffman编码 要求在下
一、二元Huffman码在通信领域,信息编码是一种最基本的理论基础与技术手段,可以针对文字、声音、图像、视频、模型等,分为信源编码、信道编码。编码的方法有很多。1952年,一位外国人提出了一种逐个符号的编码方法,姑且称为H编码方法。其基本思想如下:
设有n个信号u1,u2,…,un,其概率分布依次为p(u1),p(u2),…,p(un),称为信号值,且满足下式:
p(u1)+p(u2)+…+p(un)=1
简记为:
H码的编码步骤可以简述为:
(1) 首先将n个信号按值的大小排列。
(2) 将最小的两个信号合并成一个新的信号,新信号的值为该两信号值的和,从而将原n个信号缩减为n-1个信号。
(3) 把缩减后的信号仍按值递减排列,然后再将其中最小的两个信号合并成一个新信号,这样又缩减为n-2个信号。
(4) 依此类推,直至只剩下1个信号为止。
(5) 将每次合并的两个信号分别用“0”和“1”两个符号表示。
(6) 从最后一级开始,向前返回,就得出各信号所对应的符号序列,即为各信号对应的码字。
例如:已知
其对应的H码如图所示:
再如:对
有两种编码过程:
方法(a)的具体原则是,把合并后的信号总是放在其他相同值的信号之上(或之左),方法(b)则是把合并后的信号值放在其他相同值的信号之下(或之右)。通过分析,方法(a)优于方法(b),方法(a)的方差比方法(b)的方差要小许多。
二、m元Huffman码
上面讨论的编码方法可称为二元编码,其思想可推广到m元编码。不同的只是每次把值最小的m个信号合并成一个新的信号,并分别用0,1,…,m-1等m个符号来表示。
对于m元编码,信号个数n必须满足下式:
n=(m-1)Q+m
式中: n——信号个数
m——码元数
Q——缩减次数
对于二元码,总能找到一个Q,满足上式。但对于m元码,当n为任意正整数时,不一定能找到一个Q满足上式,此时,可以人为地增加一些值为零的信号以满足上式。然后取值最小的m个信号合并成一个新信号,并把这些信号的值相加作为该新信号的值,重新由大到小排序,再取最小的m个信号合并,如此下去。
m元的H码编码步骤如下:
(1) 验证所给n是否满足上式,若不满足,可以人为地增加一些值为零的信号,以使最后一步有m个信号;
(2) 取最小的m个符号合并成一个新信号,并分别用0,1,…,m-1给各分支赋值,把这些信号的值相加作为该新信号的值;
(3) 将新信号和剩下信号重新排序,重复(2)。
(4) 从最后一级开始,向前返回,就得出各信号所对应的符号序列,即为各信号对应的码字。
后来新加的值为零的信号,虽也赋予码字,但实际上是冗余码字,并未用上,但这样编成的码,仍是最佳的,也就是平均码长最短,如果等值信号排队时注意到顺序,则码长的方差也是最小的。
例如:
已知
其三元编码如下图所示:
四元编码如下图:
要求:
编写代码,设有50个信号,用二种方法,运行程序后,显现下面的参考界面:
H码编码
============
1.方法A
2.方法B
请选择(1或2 ,0:退出):
选择一个菜单后,要求输入码元数N,N取值范围为2~16。输入后,显示编码结果。