一个关于数据结构的问题,有关哈夫曼编码的,解答看不懂,求解答,谢谢!

一个关于数据结构的问题,有关哈夫曼编码的,解答看不懂,求解答,谢谢!,第1张

根据题意哈夫曼树的形状类似如下
o
/ \
o Y
/ \
o Y
/ \
o o
/ \ / \
A B C D
或者
o
/ \
o Y
/ \
o Y
/ \
o C
/ \
A B
第1点,编码长度不超过4,每一个“/”边表示为0 ,“\”边表示为1,如上图A的编码是:0000,B是0001,如果深度超过5,有六层的话,最下面的叶子结点编码有5位,所以编码长度不超过4,说明哈夫曼树深度不超过5
第2点,编码1 和 01 是在深度为2、3层,如上面的图Y。
第3点,其他字符有可能是00或者 0000 0001 0010 0011或者 001 0000 0001 在第三层 第四层 第五层,这里说只能在第四层和第五层,不严谨。有可能只有是三个字符的时候,只有三层了。
还可以多少个字符编码:1个或者3个或者4个。

方案一应该指的就是下面那个图了
下面那个图是一棵二进制的哈夫曼树,其中因为是二进制编码,所以使用的是0\1的边
那么对于每一个叶子节点来说,从根节点到叶子节点走过的边就是这个数字的编码
那么举一个例子,比如频数=2的也就是最左端的那个叶节点,根到它走了5个0,它的编号就是"00000";在比如说10这个叶子节点,根节点到他走了"0011",它的编号也就是0011
那么根据上面几个例子,那么叶子到根的距离[叶子的深度],也就是边的条数,就是这个叶子所代表的编码长度
比如19\32\21到根的距离都是2,7\6\10到根的距离都是4,2\3到根的距离都是5
也就是上面那个WPL的系数的意思
表示单个编码长度使用频率=总的编码长度
而方案二表示的传统编码,就是上面表格中的那个等长编码:"000""001"
它们的长度都是3,所以就是3
然后为什么哈夫曼编码正确而且最优呢
哈夫曼编码由于构成了一棵树,而且是叶子节点作为编码的代表,所以没有任何一个编码是另一个编码的前缀,所以哈夫曼编码是一个具有正确性的编码
然后哈夫曼树的构造是根据贪心的思想,每次选出两个最小的点合成一个新的点所构成的就满足了最优性
构造的过程应该书上会有写我就不再赘述了

设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=04,P2=01,P3=P4=02,P5=01。

霍夫曼编码是变长编码,思路:对概率大的编的码字短,概率小的编的码字长,这样一来所编的总码长就小,这样编码效率就高。上面那样求是不对的,除非你这6个码字是等概率的,各占1/6。应该用对应的概率其对应得码长,再求和。

实际应用中

除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。

按照CCITT标准,需要统计2×1728种游程(长度),这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。

恩,楼主这个题目相当复杂啊
首先读文件,按字符读。一个一个读,统计所有出现字符的频数。
记录到一个链表里吧
第二步,建树。霍夫曼树……复杂程度可想而知。
Huffman 算法
思想: 权大的外结点靠近根, 权小的远离根。
算法: 从m个权值中找出两个最小值W1,W2构成
w
w1 w2 W=W1+W2表通过该结点的频度。
依次往上找……
估计你的100个字符的短文,出现的字符数量估计平均有20个左右,建的树的高度就12就算低的。
3 按结点到跟的距离编码,从左到右编码为0 1 0 1依次进行……
生成霍夫曼编码
把每个字幕的二进制编码记录,打出,这就是密码表
然后对原来的文件进行打印,碰到相应的字母打印出相应的密码(二进制啊,汗……)
估计只有拿到密码才能看明白那一串的01!!
如果某一电文出现的字符为D={M,S,T,A,Q, K} , 每个字符出现的频率为W={10,29,4,8,15,7},
则用改算法生成的密码为:
S:0 A:100 M:101 Q:111
T:1100 K:1101
100 1100 101 0 111 0 1101 0 0 密文的含义是:
A T M S Q S K S S


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12708969.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存