通信电文使用的字符集为{a,b,c,d},各字符出现的频度为:0.4,0.3,0.2,0.1,试为这4个字符设计哈夫曼编码
其中编码长度最长的字符是'b'和'e',编码长度均为4
我写的 可以输入 多个字符的 你分太低了~~
#include
#include
#include
#define MAX 50
struct node
{
char data;
int aging; /*取数标记*/
int weight;
int l_r; /*左1右0*/
int parent;
int left;
int right;
}
main()
{
struct node hfnode[2*MAX];
int i,j,num,n,k,inttemp;
char chararr[MAX];
char s[MAX];
char miwen[MAX];
int miwenlong;
int mark[20];
int weight[MAX];
int minleft;
int minright;
void code(struct node hfnode[2*MAX],int n,int inttemp);
void decode(struct node hfnode[2*MAX],int n,char miwen[MAX],int miwenlong);
printf("input n");
scanf("%d",&n);
for(i=0;i<n;i++) /*输入开始*/ /*如若多个数据的权值相等编号小的权值小*/
{
getchar();
printf("the %dst char : ",(i+1));
scanf("%c",&chararr[i]);
printf("weight:");
scanf("%d",&weight[i]);
}
minright=0;
for(i=0;i<n;i++) /*初始化所有结点*/
{
hfnode[i].weight=weight[i];
hfnode[i].data=chararr[i];
hfnode[i].aging=0;
hfnode[i].parent=0;
hfnode[i].l_r=3;
}
for(j=0;j<n-1;j++) /*建树*/
{
inttemp=2000;
for(i=0;i<n+j;i++) /*元素n到元素(n+j)保存新生成的结点*/
{ /*如若多个数据的权值相等编号小的权值小*/
if(hfnode[i].aging!=1&&inttemp>hfnode[i].weight)
{
minleft=i;
inttemp=hfnode[i].weight;
}
}
hfnode[minleft].aging=1; /*取出最小左子屏蔽此节点*/
inttemp=2000;
for(i=0;i<n+j;i++)
{ /*aging为已经选取过的结点*/
if(hfnode[i].aging!=1&&inttemp>hfnode[i].weight)
{
minright=i;
inttemp=hfnode[i].weight;
}
}
hfnode[minleft].l_r=1;
hfnode[minright].l_r=0;
hfnode[minleft].aging=1;
hfnode[minright].aging=1; /*取出最小右子屏蔽此节点*/
hfnode[minleft].parent=(j+n); /*j+n 为森林中新的树*/
hfnode[minright].parent=(j+n);
hfnode[n+j].weight=(hfnode[minleft].weight+hfnode[minright].weight);
hfnode[n+j].left=minleft;
hfnode[n+j].right=minright;
} /*打印树*/
printf("
======================================================
");
printf("
shu number parent l_r weight data right left");
for(i=0;i<(2*n-1);i++)
printf("
shu %d %d %d %d %c %d %d",\
i,hfnode[i].parent,hfnode[i].l_r,hfnode[i].weight,hfnode[i].data,hfnode[i].left,hfnode[i].right);
hfnode[2*n-2].parent=(2*n-2); /*标记根节点*/
printf("
======================================================
");
printf("
shu ru yao jia mi de zi fu de shu liang
");
printf("input num:");
scanf("%d",&num);
printf("shu ru yuan wen: ");
scanf("%s",&s); /*接收原文*/
printf("
=====================================================
"); /*接收原文结束*/
for(i=0;i<num;i++) /*逐个译码*/
{
for(j=0;j<n;j++) /*查找相应的结点*/
{
if(s[i]==hfnode[j].data)
code(hfnode,n,j); /*译码结束*/
}
}
printf("
==============================================================");
printf("
shu ru yao jia mi de zi fu de mi wen changdu :");
scanf("%d",&miwenlong);
printf("shu ru mi wen: ");
scanf("%s",&miwen); /*接收密文*/
printf("mi wen wei : ");
decode(hfnode,n,miwen,miwenlong); /*译码*/
getch();
}
void code(struct node hfnode[2*MAX],int n,int inttemp)
/*递归加密函数*/
{
int i;
i=inttemp;
if(inttemp==(2*n-2))
return;
else
{
inttemp=hfnode[inttemp].parent; /*递归至父结点*/
code(hfnode,n,inttemp);
printf("%d",hfnode[i].l_r);
}
}
void decode(struct node hfnode[2*MAX],int n,char miwen[MAX],int miwenlong) /*译码函数*/
{
int i,j,k;
k=(2*n-2);
for(i=0;i<miwenlong;i++) /*按照 左0右1 移动索引k*/
{
if(miwen[i]=='1')
{
k=hfnode[k].left;
}
if(miwen[i]=='0')
{
k=hfnode[k].right;
}
if(hfnode[k].data!='\0') /*判定是否输出*/
{
printf("%c",hfnode[k].data);
k=(2*n-2);
}
}
}
1
/ \
a(0.4) 0.6
/ \
0.3 b(0.3)
/ \
d(0.1) c(0.2)
对应的哈夫曼编码是a:0 b:11 c:101 d:100
对于确定的字符集的电文字符串编码,实现最高的通信效率,编程实现对于...
这个属于不等位编码中的哈弗曼编码,利用二叉树达到编码的目的的,二叉树每个节点都是一个机构体,当这个节点没有子节点的时候它的字符属性就是电文的一个字符,所以将出现频率越高的字符越靠近跟节点,这样的编码率最高。我这里有个c语言的代码,你去用这个代码运行下,在运行的窗口中分别输入字符和...
EDI主要内容
EDI应用标准体系主要指在应用过程中用到的字符集标准及其他相关标准,包括: 信息交换用七位编码字符集及其扩充方法;信息交换用汉字编码字符集;通用多八位编码字符集;信息交换用汉字编码字符集辅2集、4集等。 EDI标准体系的框架结构并非一成不变,它将随着EDI技术的发展和EDI国际标准的不断完善而将不断地进行更新和充...
电子商务中的EDI 是指什么?
EDI应用标准体系主要指在应用过程中用到的字符集标准及其他相关标准,包括: 信息交换用七位编码字符集及其扩充方法;信息交换用汉字编码字符集;通用多八位编码字符集;信息交换用汉字编码字符集辅2集、4集等。 EDI标准体系的框架结构并非一成不变,它将随着EDI技术的发展和EDI国际标准的不断完善而将不断地进行更新和...
数据结构题,求助,
因此,对于8个字符,结点总数为:结点总数 = 2 * 叶子结点数目 - 1 = 2 * 8 - 1 = 16 - 1 = 15 所以,哈夫曼树中的结点总数为15个。由于哈夫曼树的构造过程涉及具体的树形结构,这里无法用文字完整描述整个树的结构,但通过上述方法,您可以手动绘制出完整的哈夫曼树,并验证结点总数。
哈夫曼字符编码
每次合并二个最小的概率。一开始:c(0.02) . f(0.03) 最小,合并成一个。 cf (0.05) .并且,左边先编 0,右边编1。再继续合并下去。4,2,5,指1001,01,10111的个数。
电子数据交换的标准体系
电子数据交换(Electronic Data Interchange,EDI)是目前为止最为成熟和使用范围最广泛的电子商务应用系统。其根本特征在于标准的国际化,标准化是实现EDI的关键环节。早期的EDI标准,只是由贸易双方自行约定,随着使用范围的扩大,出现了行业标准和国家标准,最后形成了统一的国际标准。国际标准的出现,大大地...
佛聂复方:[答案] 假设用于通信的电文由字符集{a,b,c,d,e,f,g,h}中的字母构成,这8个字母在电文中出现的概率分别为{0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10}.(1)为这8个字母设计哈夫曼编码.(2)若用这三位二进制数(0…7)对这8个字母进行等长编码,则哈夫曼编...
户县19639735393: 假设用于通信的电文由字符集{a,b,c,d,e,f,g,h,}中的字母构成,这8个字母在电文中出现的 - ?
佛聂复方: 题目:假设用于通信的电文由字符集{a,b,c,d,e,f,g,h,}中的字母构成,这8个字母在电文中出现的 频率分别为: {0.19, 0.21, 0.02, 0.03, 0.06, 0.07, 0.1, 0.32}.要求:画出哈夫曼树. 我从课本上面摘抄了一个题目,题目大概是上面这样的,我们这里只是详细的说明一下哈弗曼树要怎么构建.借用一下这个题目.分析:我们这里直接将小数整数化,容易看出大小来. 原文地址:http://blog.csdn.net/qingdujun/article/details/16860297
户县19639735393: 假设通信电文使用的字符集为{a,b,c,d,e,f},各字符在电文中出现的频率分别为{34,5, 12,23,8,18},利用构造 - ?
佛聂复方: 其中编码长度最长的字符是'b'和'e',编码长度均为4
户县19639735393: 假定用于通信的电文由8个字母组成,分别是A,B,C,D,E,F,G,和H,各字母在电文中出现的 - ?
佛聂复方: 11111111 110 11111110 1111110 11110 1110 10 111110
户县19639735393: 哈夫曼编码???
佛聂复方: 哈夫曼树的构造原理,就是先选取概率最小的两个,就是0.02和0.03,相加,得到0.05,同时删去0.02和0.03,然后把0.05放到原来的集合里面,再次选取最小的两个(现在是0.05和0.06)..这样不断进行,直到只剩一个元素为止.. 举个简单例子..生成哈夫曼树之后,左子树为0,右子树为1,根节点不算在内..您的电文哈夫曼编码是:
户县19639735393: 假设通信电文使用的字符集为{a,b,cd,e,f,g},字符的哈夫曼编码依次为:0110,10,1 - ?
佛聂复方: 数据结构学的不好
户县19639735393: 哈夫曼树 设计哈夫曼编码 - ?
佛聂复方: a0.3,b0.2,c0.15,d0.1,e0.1,f0.05,g0.05,h0.05 a0.3,b0.2,c0.15,d0.1,e0.1,f0.05,(g,h)0.1 a0.3,b0.2,c0.15,d0.1,e0.1,(f,(g,h))0.15 a0.3,b0.2,c0.15,(d,e)0.2,(f,(g,h))0.15 a0.3,b0.2,(d,e)0.2,(c,(f,(g,h)))0.3 a0.3,(b,(d,e))0.4,(c,(f,(g,h)))0.3 (b,(d,e))0.4,(a(c,(f,(g,h)))...
户县19639735393: 哈夫曼编码树怎么解? - ?
佛聂复方: 先编造哈夫曼树,哈夫曼树构造规则: 假设有n个权值,则构造出的哈夫曼树有n个叶子结点. n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为: (1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点); (2) ...