一道关于求哈夫曼编码的数据结构题,求解答

作者&投稿:错命 (若有异议请与网页底部的电邮联系)
一个关于数据结构的问题,有关哈夫曼编码的,解答看不懂,求解答,谢谢!~

根据题意哈夫曼树的形状类似如下
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个。

设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。首先,将符号按照概率由大到小排队,如图所示。编码时,从最小概率的两个符号开始,可选其中一个支路为0,另一支路为1。这里,我们选上支路为0,下支路为1。再将已编码的两支路的概率合并,并重新排队。多次重复使用上述方法直至合并概率归一时为止。从图(a)和(b)可以看出,两者虽平均码长相等,但同一符号可以有不同的码长,即编码方法并不唯一,其原因是两支路概率合并后重新排队时,可能出现几个支路概率相等,造成排队方法不唯一。一般,若将新合并后的支路排到等概率的最上支路,将有利于缩短码长方差,且编出的码更接近于等长码。这里图(a)的编码比(b)好。
图1 赫夫曼编码原理
赫夫曼码的码字(各符号的代码)是异前置码字,即任一码字不会是另一码字的前面部分,这使各码字可以连在一起传送,中间不需另加隔离符号,只要传送时不出错,收端仍可分离各个码字,不致混淆。
实际应用中,除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。按照CCITT标准,需要统计2×1728种游程(长度),这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。其中q称主码,r为基码。编码时,不小于64的游程长度由主码和基码组成。而当l为64的整数倍时,只用主码的代码,已不存在基码的代码。

哈夫曼编码首先要构造哈夫曼树,其构造规则是从概率这个序列中选择两个最小结点的值构造一颗树,新的树根的权值为两个子树的概率权值和。
如题中,首先选择0.02 和 0.03构造一颗树,将权值之和放回序列中,为:
0.07 0.19 0.10 0.32 0.21 0.06 0.05
继续上述过程只剩下一颗树为止。
最终哈夫曼树为:
1
/ \
0.40 0.60
/ \ / \
b0.19 g0.21 0.28 e0.32
/ \
0.11 0.17
/ \ / \
0.05 h0.06 a0.07 d0.10
/ \
f(0.02) c(0.03)
哈夫曼编码是从根结点开始,找叶子结点,也就是相关字符,默认往左为0,往右为1
所以b的编码是00,g:01 e:11 h:1001 a:1010 d:1011 f:10000c:10001


...中出现的频率分别是7,19,2,6,32,3,21,10写出哈夫曼编码
\/\/ ---求赫夫曼编码--- int min(HuffmanTree t,int i){ \/\/ 函数void select()调用 int j,flag;unsigned int k=UINT_MAX; \/\/ 取k为不小于可能的值 for(j=1;j<=i;j++)if(t[j].weight<k&&t[j].parent==0)k=t[j].weight,flag=j;t[flag].parent=1;return flag;} \/\/---...

急需这些题的答案 与详细越好 谢谢
第五题哈夫曼数 a(011) b(10 ) c(00) d(010) e(11)电文总长度:12 1100011100010101的相应电文:ecabcbb 第四题类似。

哈夫曼编码算法的实现
<<" ∣ I---创建哈夫曼树 ∣\\n"<<" ∣ ∣\\n"<<" ∣ E---文件编码 ∣\\n"<<" ∣ ∣\\n"<<" ∣ D---文件译码 ∣\\n"<<" ∣ ∣\\n"<<" ∣ P---打印代码文件 ∣\\n"<<" ∣ ∣\\n"<<" ∣ T---印哈夫曼树 ∣\\n"<<" ∣ ∣\\n"<<" ∣ O---哈夫曼树的存储结构...

有人可以帮我注释一段关于用c语言实现哈夫曼树的代码吗?
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码。 首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是...

...在发送端根据输入的内容构造哈夫曼树并编码,在接收端怎么译码呢...
Huffman 编码 一、实验目的 熟悉Huffman编码方法。了解并弄懂Huffman编码实现信息的无损压缩原理。二、实验要求 熟悉C语言编程。三、实验内容 1.根据给定的n个权值(w1, w2, …, wn)构成n棵二叉树的集合F=,其中每棵二叉树Ti中只有一个带树为Ti的根结点 2.在F中选取两棵根结点的权值最小的树作为...

数据结构问题
.设用于通信的电文仅由A,B,C,D,E,F这6个字母组成,字母在电文中出现的次数分别为7、9、2、6、3、5,试为这6个字母设计哈夫曼编码,要求画出哈夫曼树。... .设用于通信的电文仅由A,B,C,D,E,F这6个字母组成,字母在电文中出现的次数分别为7、9、2、6、3、5,试为这6个字母设计哈夫曼编码,要求画...

我们有个数据结构的哈夫曼编码解码的课程设计,你能帮帮我吗
哈夫曼编码系统设计任务:从键盘输入一串电文字符能输出对应的哈夫曼编码。同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符串。设计要求:(1)从终端读入字符集大小n,以及... 哈夫曼编码系统设计任务: 从键盘输入一串电文字符能输出对应的哈夫曼编码。同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符...

用c语言完成:1.哈夫曼编码\/译码器2.内部排序算法的性能分析
hc=(HUFFMANCODE)malloc((n+1)*sizeof(char*));\/\/分配n个字符编码的头指针 cd=(char*)malloc(n*sizeof(char));\/\/分配求编码的工作空间 cd[n-1]='\\0';\/\/编码结束符 for(i=1;i<=n;++i)\/\/逐个字符求哈夫曼编码 { start=n-1; for(child=i,father=ht[i].parent;father!=0;child=father,fa...

到底什么是哈夫曼树啊,求例子
每棵树仅有一个结点);2、 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;3、从森林中删除选取的两棵树,并将新树加入森林;4、重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

已知字符集{a,b,c,d}的权值集合为{7,5,1,2},构造哈夫曼树,并求出...
树的路径长度是从树根到每一结点的路径长度之和;WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。A-B合并(权5)A-B再和C合并(权10)D-E合并(...

苏仙区13544652615: 一道数据结构题目:哈弗曼算法求解描述求解最优前缀码(平均码长最小)问题的哈夫曼(Huffman)算法的基本思想.并对以下实例,给出其哈夫曼编码及求... -
谏瑶克尼:[答案] 运行过了没有任何问题,有什么问题可以交流下. #include #include #define N 6 typedef struct { int W,P,R,L; }HTNode; typedef struct { char ch; char code[10]; }HTCode; HTCode HC[27]; void select(HTNode HT[],int *min1,int *min2,int *a,int *b) { int i;int ...

苏仙区13544652615: 求解,关于数据结构的哈夫曼编码的问题 -
谏瑶克尼: 方案一应该指的就是下面那个图了.下面那个图是一棵二进制的哈夫曼树,其中因为是二进制编码,所以使用的是0\1的边.那么对于每一个叶子节点来说,从根节点到叶子节点走过的边就是这个数字的编码.那么举一个例子,比如频数=2的也就是最...

苏仙区13544652615: 数据结构题目,关于哈弗曼编码,用C语言来做(非常急的,谢谢了) -
谏瑶克尼: void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) { // w存放n个字符的权值(均>0),构造哈夫曼树HT, // 并求出n个字符的哈夫曼编码HC int i, j, m, s1,s2; char *cd; int p; int cdlen; if (n m = 2 * n - 1; HT = (HuffmanTree)...

苏仙区13544652615: 哈夫曼树及哈夫曼编码的C程序实现(数据结构题) -
谏瑶克尼: #include #define MAXINF 10000 struct htnode { int ww; int parent,llink,rlink; }; struct httree { int m; int root; struct htnode *ht; }; typedef struct httree *phttree; phttree huffman(int m,int *w) { phttree pht; int i,j,x1,x2,m1,m2; pht=(phttree)malloc(sizeof(struct ...

苏仙区13544652615: 一道关于哈夫曼编码的题该怎么做? -
谏瑶克尼: 首先,亲请记住,无论是数学题政治题C语言,任何情况下都不可以选“以上都不是”.哈夫曼编码是非常经典的一种变长编码方案.我偷个懒,方法描述如下:首先,将符号按照概率由大到小排队.编码时,从最小概率的两个符号开始,可选...

苏仙区13544652615: 数据结构的哈夫曼编码可以根据自己画的哈夫曼树写出编码,最终结果一样,请专业人士帮我做一下这道题,顺 -
谏瑶克尼: 哈夫曼树为: 100 / \ 60 40 / \ / \ 28 32 19 21 / \ 11 17 / \ / \ 5 6 7 10 / \ 2 3 编码左子树/为0 右子树\为1 a:0010,b10 c 00000,其他自己看一下

苏仙区13544652615: 关于哈夫曼编码的一道题 -
谏瑶克尼: 下面是我写的一个程序,希望能满意. #include<iostream> using namespace std;struct htnode {char ch;int weight;int parent;int lchild,rchild; };class huffmantree { public:void code(char str1[],int w[],int n);void uncode(char str1[],char str2[],int ...

苏仙区13544652615: 已知信息为ABCDBCDCBDBACB,构造哈夫曼树已知信息为ABCDBCDCBDBACB1 请按此信息构造哈夫曼树;2 计算哈夫曼树的加权路径长度WPL3 求出... -
谏瑶克尼:[答案] 这2个都对,权值小的在左边在右边没关系,这个没限制,最后算出的带权路径长度最小就可以 33 / 21 12 /

苏仙区13544652615: 试编写实现哈夫曼树和哈夫曼编码的算法?这是数据结构里的问题,要求用C++6.0来实现 -
谏瑶克尼: #include <stdio.h> #include <malloc.h> #include<math.h> struct hf { char data; int weight; struct hf *lc; struct hf *rc; struct hf *pc; int hcd[30]; } *hc[30]; int n;main() {struct hf creat(); struct hf bian(struct hf *hc[30]); struct hf print(struct hf *hc[30]);int m;do ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网