给定某英文文本,采用哈夫曼编码方法时的总编码长度为________位?

作者&投稿:龙该 (若有异议请与网页底部的电邮联系)
如何用哈夫曼编码实现英文文本的压缩和解压缩?~

根据信源压缩编码——Huffman编码的原理,制作对英文文本进行压缩和解压缩的软件。要求软件有简单的用户界面,软件能够对运行的状态生成报告,分别是:字符频率统计报告、编码报告、压缩程度信息报告、码表存储空间报告。

我给你个差不多的,你自己修改一下就可以用了
/************Huffman编码和译码****************/


#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
int weight;
char ch;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef struct
{
char ch;
char *chs;
}HuffmanCode;
typedef struct
{
char ch;
int weight;
}sw;
typedef struct
{
HuffmanTree HT;
HuffmanCode *HC;
}huf;
void select(HTNode * HT,int n,int *n1,int *n2)
{
int i=1; int n3;
while(HT[i].parent!=0)
i++;
*n1=i;
i++;
while(HT[i].parent!=0) i++;
*n2=i;
if(HT[*n1].weight<HT[*n2].weight)

for(i++;i<=n;i++)
{
if(HT[i].parent==0)
{ if(HT[i].weight<HT[*n1].weight)
*n1=i;
else if(HT[i].weight<HT[*n2].weight)
*n2=i;
}
}
}

huf * HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,sw *w,int n,huf *HUF)
{int m,i,s1,s2,start,c,f;
HuffmanTree p;
char *cd;

if(n<=1) return 0;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;i++,p++,w++)

for(;i<=m;i++,p++)

for(i=n+1;i<=m;i++)
{
select(HT,i-1,&s1,&s2);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode *)malloc((n+1)*sizeof(char));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++)
{ start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)cd[--start]='0';
else cd[--start]='1';
HC[i].ch=HT[i].ch;
HC[i].chs=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i].chs,&cd[start]);
printf("%c %-10s
",HC[i].ch,HC[i].chs);
}

HUF->HT=HT;
HUF->HC=HC;
return HUF;
}
char * convert(char *chars,char *chars1,HuffmanCode *hc,int n)
{
char *p=chars; int i;
strcpy(chars1,"");

while(*p)
{
i=1; while(hc[i].ch!=*p&&i<=n) i++;
strcat(chars1,hc[i].chs); p++;
}

printf("the chars translate are:%s
",chars1);
return chars1;
}
void transcode(HuffmanTree ht,char *chars2,char*chars3)
{
int i=1,p; char *q=chars2;char *r=chars3;

while(ht[i].parent!=0) i++;
p=i;

while(*q)
{
while(ht[p].lchild!=0 && *q)
{
if(*q=='0')
p=ht[p].lchild;
else p=ht[p].rchild;
q++;
}
if(ht[p].lchild==0)

p=i;

}

*r='\0';
printf("the chars are:");
puts(chars3);

}


void input(int *n,sw *w)
{
int i;
printf("input the mount of char:");
scanf("%d",n);

for(i=1;i<=*n;i++,w++)
{printf("input the %dth char and weight:",i);
fflush(stdin);
scanf("%c%d",&w->ch,&w->weight);
}

}
void main(void)
{HTNode HT;
HuffmanCode HC,*hc;
HuffmanTree ht;
huf *HUF,huf2;
int n;
sw w[40];
char ch,inchar[500],outchar[1000];
char *abc;
char *p=inchar;
input(&n,w);
HUF=HuffmanCoding(&HT,&HC,w,n,&huf2);
printf("input chars to translate,ends of '#':");
fflush(stdin);//清除流,解决输入干扰
ch=getchar();
while(ch!='#')
{*p=ch;
p++;
ch=getchar();
}
*p='\0';
hc=HUF->HC;
ht=HUF->HT;
abc=convert(inchar,outchar,hc,n);
transcode(ht,abc,outchar);
}

79位,解法如下:

先统计一下每个字母的出现的次数:

t:2、h:1、i:4、s:3、a:2、n:2、d:1、e:1、l:1、r:1、g:1。

然后构造哈夫曼树:

23

/ \

15 8

/ \ / \

7 8 i4 _4

/ \ / \

s3 4 4 4

/ \ / \ / \

2 2 2 t2 a2 n2

/ \ / \ / \

h1 d1 e1 l1 r1 g1

所以对应的所有叶子结点的路径长度 * 出现次数 之和便是总编码长度。

WPL = 3 * 3 + 5* (1+1+1+1+1+1) + 4*(2+2+2) + 2*(4 + 4) = 79。

哈夫曼编码简介:

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。



先统计一下每个字母的出现的次数
t:2 h:1 i: 4 s:3 _:4 a:2 n:2 d:1 e:1 l:1 r:1 g:1
然后构造哈夫曼树
23
/ \
15 8
/ \ / \
7 8 i4 _4
/ \ / \
s3 4 4 4
/ \ / \ / \
2 2 2 t2 a2 n2
/ \ / \ / \
h1 d1 e1 l1 r1 g1
所以对应的所有叶子结点的路径长度 * 出现次数 之和便是总编码长度
WPL = 3 * 3 + 5* (1+1+1+1+1+1) + 4*(2+2+2) + 2*(4 + 4) = 79


给定某英文文本,采用哈夫曼编码方法时的总编码长度为___位?
79位,解法如下:先统计一下每个字母的出现的次数:t:2、h:1、i:4、s:3、a:2、n:2、d:1、e:1、l:1、r:1、g:1。然后构造哈夫曼树:23 \/ \\ 15 8 \/ \\ \/ \\ 7 8 i4 _4 \/ \\ \/ \\ s3 4 4 4 \/ \\ \/ \\ \/ \\ 2 2 2 t2 a2 n2 \/ \\ \/ \\ \/ \\ h1 d1 e1 ...

java编写:给定一个英文文本文件,进行切词并统计其中单词个数,存入一个...
package Main;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.regex.Matcher;import java.util.regex.Pattern;class Main { public static void main(String[] args) { int count = 0...

英语翻译论文怎么写?
三、具体写作步骤:1. 引言部分:简要介绍研究背景、研究意义、翻译文本的选择原因以及所采用的翻译理论或策略。2. 原文分析:对所选英文文本进行深入分析,包括文本类型、语言特点、文化内涵等,为翻译过程提供理论基础。3. 译文呈现:展示翻译过程,包括对原文的准确理解、语言转换的技巧和方法。4. 讨论...

"以……为准"用英文怎么译?
以某个版本为准的为准,一般翻译为...shall prevail。 rockywyz | 发布于2006-07-25 举报| 评论 0 0 为您推荐: 以这封邮件为准 英文 以……为准英文 请以此封邮件为准英文 以此附件为准 英文 采用英文怎么说 请求帮助的英文 幸运的英文 以中文版本为准 英文 26个英文字母咋读 圣诞节快...

文本分类方法有哪些
文本分类方向: 主要有二分类,多分类,多标签分类 文本分类方法: 传统机器学习方法(贝叶斯,svm等),深度学习方法(fastText,TextCNN等) 本文的思路: 本文主要介绍文本分类的处理过程,主要哪些方法。致力让读者明白在处理文本分类问题时应该从什么方向入手,重点关注什么问题,对于不同的场景应该采用什么方法。 文本分类的处理...

c语言程序设计:1,统计英文文本中单词个数。2,统计某一特定单词出现的频...
1、统计英文文本中单词个数。if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')) sum++;2、统计某一特定单词出现的频度。for(i=0;i!='\/0';i++){ if(a[i]=='特定单词')sum++;}

参考文献的格式怎么写?
参考文献按照其在正文中出现的先后以阿拉伯数字连续编码,序号置于方括号内。一种文献被反复引用者,在正文中用同一序号标示。引用一次的文献的页码(或页码范围)在文后参考文献中列出。电子文献类型为数据库[DB],计算机[CP],电子公告[EB];电子文献的载体类型为互联网[OL],光盘[CD],磁带[MT],...

间性理论的哲学基础是什么?
“间性”理论作为“主体间性”、“文本间性”、“文化间性”甚至“媒体间性”等诸理论观点的综合,其主要的哲学理论基础在于主体间性。文本间性,又称“文间性”“互文性”或“文本互涉”,即文本的互文性,(英文是intertextuality,这个词由两部分组成,inter前缀表明了一种相互交织的意思。)作为一个重要...

纽马克的翻译理论主要是什么
交际翻译”和“语义翻译”就是在这一时期就初步形成。“总的来说,文学作品可归为两类:一类是对人类行为严肃的道德评价;第二类与第一类紧紧相连,即为娱人,是一种欢愉,一种感观之乐。因为前者的原因,我总是很严肃地对待文学……这种情况和翻译相同,因为对翻译的态度亦是非常严肃。"...

文本档案详细资料大全
档案 MIME 文本档案在MIME标准中的类型为“text\/plain”,此外,它通常还附加编码的信息。在Mac OS X出现前,当Resource fork指定某一个档案的类型为“TEXT”时,Mac OS就认为这个档案是文本档案。在Windows中,当一个档案的扩展名为“txt”时,系统就认为它是一个文本档案。此外,处于特殊的目的...

化州市18769334295: 如何用哈夫曼编码实现英文文本的压缩和解压缩?
邬阀迪皿: 哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件.哈夫曼压缩属于可变代码长度算法一族.意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代.因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列.有人用C函数写了这个编码,见下面链接 http://baike.baidu.com/view/189694.htm

化州市18769334295: 什么是哈夫曼编码? -
邬阀迪皿: 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种. Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作...

化州市18769334295: 字符a、b、c、d、e出现的概率分别为:0.12,0.40,0.15,0.08,0.25,采用哈夫曼算法构造进行编码. -
邬阀迪皿: 哈夫曼算法就是找到一个最优二叉树,使得其权值和最小.先将a b c d e的概率乘以100得12,4,15,8,25.将这几个数按从小到大的顺序排列一下,4,8,12,15,25.4+8=12,添加到这个序列里,将原来的4,8划去.12+12=24,添加到序列里,将原来的12,12划去,依次类推,15+24=39,39+25=64.故得到一个层次为4的哈夫曼树,按照左1右0编码(也可以左0右1)得 a:110 b:1111 c:10 d:1110 e:0

化州市18769334295: 求文档: 对某一文档中的字符按照其出现概率进行哈夫曼编码及译码 -
邬阀迪皿: /* 哈夫曼编码*/ #include "graphics.h" #include "stdlib.h" #include "Stdio.h" #include "Conio.h" #define MAX 53char bmfile[10]; char a[100]; typedef struct {char c,s[10];}MM; MM mm[53]; typedef struct /*以数组存储哈夫曼树时的结点类型...

化州市18769334295: huffman编码算法 -
邬阀迪皿: 哈夫曼是一种编码手段.也就是说保证将来的编码是最小长度的,最终生成最小的哈夫曼编码树,又称哈夫曼最小树.它的原理是将一段文本中出现的字符按出现的频率决定其编码.然后按其最终的编码生成一段明文.知道了这个原理,编码...

化州市18769334295: java哈夫曼编码压缩文件的思想 -
邬阀迪皿: 一.模型表示: 计算机使用数字代码来存储字符,ASC II码是最常用的编码.一个ASC II码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位,共128个.要对一个文本文件进行压缩,就是要对文件内的字符重新编码,使出现次数...

化州市18769334295: 给定有18个字符组成的文本(电文):A A D A T A R A E F R T A A F T E R,画出哈夫曼树 -
邬阀迪皿: 先计算各个字符出现的个数作为权值:A 7 D 1 T 3 R3 E 2 F 2 然后选择两个最小权值的点构造新树,然后新树的根的权值(左右子树权值之和)到原序列中,重复上述过程只剩下一颗树为止.18/ \A7 11/ \5 6/ \ / \F2 T3 R3 3/ \D1 E2 默认左子树为0 右子树为1,上述哈夫曼编码是 A:0 F:100 T:101 R:110 D:1110 E:1111

化州市18769334295: 编程实现赫夫曼编码: -
邬阀迪皿: #include#include#include#include#include using namespace std;typedef char** HaffmanCode;typedef struct...

化州市18769334295: 哈夫曼译码算法 -
邬阀迪皿: C++的 #include#include #include #include ofstream outstuf; #define MAXBIT 50 // 哈夫曼编码的最大长度 #define MAXVALUE 50 // 最大权值 #define MAXLEAF 50 // 哈夫曼树中叶子结点个数 #define MAXNODE MAXLEAF*2-1 //树中结点总数 //...

化州市18769334295: 哈夫曼树编码与译码
邬阀迪皿: #define INT_MAX 10000 #define ENCODING_LENGTH 1000 #include "stdio.h" #include "string.h" #include "malloc.h" typedef enum{none,left_child,right_child} Which;//标记是左孩子还是右孩子 typedef char Elemtype; typedef struct ...

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