香农费诺编码 c语言实现,对于香农编码、费诺编码和哈夫曼编码,编码方法惟一的是()。...

问题标题

对于香农编码、费诺编码和哈夫曼编码,编码方法惟一的是()。

2019-8-15来自ip:15.170.14.227的网友咨询

浏览量:533 手机版

问题补充:

题目类型:[填空题] 对于香农编码、费诺编码和哈夫曼编码,编码方法惟一的是()。

网友答案

参考答案: 香农编码

试题难度:★★☆

参考解析: 暂无解析

网友答案

//赫夫曼编码程序严蔚敏数据结构 #include using namespace std; typedef struct { int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char **HuffmanCode; typedef char *EachHuffcode; void Select(HuffmanTree HT,int length,int &s1,int &s2) { //s1 lowest,s2 lower unsigned int min = 5000; HuffmanTree p = HT; int i; for(i = 1, ++p; i { if(p->weight parent == 0) { min = p->weight; s1 = i; } } min = 5000; p = HT; //Get the second less weight for(i = 1, ++p; i { if(p->weight parent == 0) { if( i == s1)//case s1,ignore continue; min = p->weight; s2 = i; } } } void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC, int *w,int n) { if(n return; int m = 2 * n - 1; HT = new HTNodem + 1;//0 is not used HuffmanTree p = HT; int i; for( i = 1, ++p; i { p->weight = *w;//NOte: never use this *p = {*w,0,0,0,0},because *p has already been declared p->parent = p->lchild = p->rchild = 0; } for(; i p->weight = p->parent = p->lchild = p->rchild = 0; int s1; int s2; for( i = n + 1; i { Select(HT,i-1,s1,s2); HTs1.parent = i ; HTs2.parent = i; HTi.lchild = s1; HTi.rchild = s2; HTi.weight = HTs1.weight + HTs2.weight; } HC = new EachHuffcoden+1;//0 is not used char *cd = new charn; cdn-1 = '\0';//the end of each char int start; for(int i = 1; i {//get each huff code for h1 to hn start = n -1; for(int c = i, int f = HTi.parent; f != 0; c = f ,f = HTf.parent) if(c == HTf.lchild) cd--start = '0'; else cd--start = '1'; HCi = new charn - start;//allocate memory for each HT strcpy(HCi,&cdstart); } delete cd;//don't forget release memory } int main(int argc, char* argv) { HuffmanTree hftree = NULL; HuffmanCode hfcode = NULL; int weight4 = {7,5,2,4};//four node's weight HuffmanCoding(hftree,hfcode,weight,4); EachHuffcode *p = hfcode; ++p; for (int i = 0; i { cout } for(int i = 1; i delete hfcodei;//release memory delete hfcode; delete hftree; return 0; }

网友答案

//赫夫曼编码程序严蔚敏数据结构 #include using namespace std;typedef struct{ int weight; int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char **HuffmanCode;typedef char *EachHuffcode;void Select(HuffmanTree HT,int length,int &s1,int &s2){ //s1 lowest,s2 lower unsigned int min = 5000; HuffmanTree p = HT; int i; for(i = 1, ++p; i weight parent == 0) { min = p->weight; s1 = i; } } min = 5000; p = HT; //Get the second less weight for(i = 1, ++p; i weight parent == 0) { if( i == s1)//case s1,ignore continue; min = p->weight; s2 = i; } }}void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC, int *w,int n){ if(n weight = *w;//NOte: never use this *p = {*w,0,0,0,0},because *p has already been declared p->parent = p->lchild = p->rchild = 0; } for(; i weight = p->parent = p->lchild = p->rchild = 0; int s1; int s2; for( i = n + 1; i <= m; ++i) { Select(HT,i-1,s1,s2); HTs1.parent = i ; HTs2.parent = i; HTi.lchild = s1; HTi.rchild = s2; HTi.weight = HTs1.weight + HTs2.weight; } HC = new EachHuffcoden+1;//0 is not used char *cd = new charn; cdn-1 = '\0';//the end of each char int start; for(int i = 1; i <= n ; ++i) {//get each huff code for h1 to hn start = n -1; for(int c = i, int f = HTi.parent; f != 0; c = f ,f = HTf.parent) if(c == HTf.lchild) cd--start = '0'; else cd--start = '1'; HCi = new charn - start;//allocate memory for each HT strcpy(HCi,&cdstart); } delete cd;//don't forget release memory}int main(int argc, char* argv){ HuffmanTree hftree = NULL; HuffmanCode hfcode = NULL; int weight4 = {7,5,2,4};//four node's weight HuffmanCoding(hftree,hfcode,weight,4); EachHuffcode *p = hfcode; ++p; for (int i = 0; i < 4; ++i,++p) { cout<

网友答案

答案可能不唯一 取决于你的哈夫曼树是怎么建立的 但一般习惯是左边的数比右边的数小----------------27------------11------16----------c----6---b----e-------------d---a-代表空格 排版需要这是建立的哈夫曼树按照一般习惯是左0右1 编码为a011 b10 c00 d010 e11还有 顶点是27...怎么会算个25出来啊...汗!

网友答案

太复杂了,一会记得多给我点分!谢谢啦! 先设权w=(31,22,18,14,10,4,1),n=7,则m=13,按照哈夫曼算法可以构造一棵哈夫曼树如下: 100 40 60 22 18 31 29 14 15 10 5 4 1 末端结点为22,18,31,14,10,4,1,你自己把上面的加上线连成一棵二叉树就行,记得左分支标0,右分支标1为了得出后面的哈夫曼编码HC 然后需要列出HT初态表和HT终态表,如下: HT初态表 HT终态表 weight parent lchild rchild weight parent lchild rchild 1 31 0 0 0 31 12 0 0 2 22 0 0 0 22 11 0 0 3 18 0 0 0 18 11 0 0 4 14 0 0 0 14 10 0 0 5 10 0 0 0 10 9 0 0 6 4 0 0 0 4 8 0 0 7 1 0 0 0 1 8 0 0 8 - 0 0 0 5 9 6 7 9 - 0 0 0 15 10 5 8 10 - 0 0 0 29 12 4 9 11 - 0 0 0 40 13 2 3 12 - 0 0 0 60 13 1 10 13 - 0 0 0 100 0 11 12 最后得出哈夫曼编码HC: 1——>10 2——>00 3——>01 4——>110 5——>1110 6——>11110 7——>11111 平均码字长度为0.31+0.22+0.18*2+0.14*3+0.1*4 +(0.04+0.01)*5=2.47 编码效率为1-0.01*3+0.01*2/2.47=1.21 解答完毕! 补充:对于其中的编码效率问题本人有点淡忘,我选择的是用 普通平均编码长度除上了哈夫曼平均编码长度得出,不知对否。

辛苦半天,望能赐我分数,不胜感激!注:提交后发现格式不太规整,对于哈夫曼树谁是谁的左孩子、右孩子比较容易分出左右孩子结点相加可知父亲结点,对于HT初态表和HT终态表1列1列的看就行!其中数字第一列为序号,从第2列到第9列分别对应HT初态表的weight parent lchild rchild 和HT终态表的weight parent lchild rchild 。

网友答案

#include#include#include#include#include#define MAXVALUE 10000 /*权值最大值*/#define MAXLEAF 30 /*叶子最多个数*/#define MAXNODE MAXLEAF*2-1 /* 结点数的个数*/#define MAXBIT 50 /*编码的最大位数*/typedef struct node /*结点类型定义*/{ char letter; int weight; int parent; int lchild; int rchild;}HNodeType;typedef struct /*编码类型定义*/{ char letter; int bitMAXBIT; int start;}HCodeType;typedef struct /*输入符号的类型*/{ char s; int num;}lable;void HuffmanTree(HNodeType HuffNode,int n,lable a){ int i,j,m1,m2,x1,x2,temp1; char temp2; for (i=0;ihuffman树*/ { m1=m2=MAXVALUE; x1=x2=0; for (j=0;j编码*/ { cd.start=n-1; c=i; p=HuffNodec.parent; while (p!=-1) { if (HuffNodep.lchild==c) cd.bitcd.start=0; else cd.bitcd.start=1; cd.start--; c=p; p=HuffNodec.parent; } for (j=cd.start+1;j编码*/ HuffCodei.bitj=cd.bitj; HuffCodei.start=cd.start; } for (i=0;i哈夫曼编码,直到输入为end结束! /"的是电文出现概率也要自己计算的可以说更智能些吧。

要是不满意,略做修改就可以了。

网友答案

霍夫曼编码的基本思想:输入一个待编码的串,首先统计串中各字符出现的次数,称之为频次,假设统计频次的数组为count ,则霍夫曼编码每次找出count数组中的值最小的两个分别作为左右孩子,建立他们的父节点,循环这个操作2*n-1-n(n是不同的字符数)次,这样就把霍夫曼树建好了。

建树的过程需要注意,首先把count数组里面的n个值初始化为霍夫曼树的n个叶子节点,他们的孩子节点的标号初始化为-1,父节点初始化为他本身的标号。

接下来是编码,每次从霍夫曼树的叶子节点出发,依次向上找,假设当前的节点标号是i,那么他的父节点必然是myHuffmantreei.parent,如果i是myHuffmantreei.parent的左节点,则该节点的路径为0,如果是右节点,则该节点的路径为1。

当向上找到一个节点,他的父节点标号就是他本身,就停止说明该节点已经是根节点。

还有一个需要注意的地方:在查找当前权值最小的两个节点时,那些父节点不是他本身的节点不能考虑进去,因为这些节点已经被处理过了香农第一定理可变长无失真信源编码定理设离散无记忆信源X包含N个符号{x1,x2,…,xi,..,xN},信源发出K重符号序列,则此信源可发出N^k个不同的符号序列消息,其中第j个符号序列消息的出现概率为PKj,其信源编码后所得的二进制代码组长度为Bj,代码组的平均长度B为B=PK1B1+PK2B2+…+PKN^kBN^k当K趋于无限大时,B和信息量H(X)之间的关系为B*K=H(X)(K趋近无穷)香农第一定理又称为无失真信源编码定理或变长码信源编码定理。

香农第一定理的意义:将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。

香农第二定理有噪信道编码定理有噪信道编码定理。

当信道的信息传输率不超过信道容量时,采用合适的信道编码方法可以实现任意高的传输可靠性,但若信息传输率超过了信道容量,就不可能实现可靠的传输。

设某信道有r个输入符号,s个输出符号,信道容量为C,当信道的信息传输率R=0,和任意小的a>0,以及任意足够长的码长N,则一定存在一种信源编码W,其码字个数为M<=EXP{NR(D)+a},而编码后码的平均失真度D'(W)<=D+a。

我来回答

验证码:

e9568dae565949379ec40a9dfa476c45.gif

大家还关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值