哈弗曼树的在二进制编码中的应用
给定一篇英语短文(English.txt),编写程序实现如下功能:1、 统计短文中个英文字符和标点、空格出现的频率;
2、 以这些字符出现的频率为叶子节点的权值,建立一棵哈夫曼树,即最优二叉树,程序输出编码方案;
3、 用该编码方案对短文编码,生成english_01.txt;
4、 对english_01.txt反编码,生成english_inverse.txt;
这是一些要求,请求大神们帮忙解决,请求代码,谢谢 {:10_245:}{:10_245:}至少你自己写一点代码什么的吧,如果都让别人想好写出来,那样锻炼不了你的编程能力和思维 lumber2388779 发表于 2017-4-19 15:23
至少你自己写一点代码什么的吧,如果都让别人想好写出来,那样锻炼不了你的编程能力和 ...
尴尬 , 尴尬我就是百度了很久也不知道怎么下手才来求助的{:10_269:}{:10_269:} 寻123 发表于 2017-4-19 17:30
尴尬 , 尴尬我就是百度了很久也不知道怎么下手才来求助的
先把创建插入删除二叉树的部分先实现出来,然后在修改成用英文字符和标点空格创建二叉树,再将二叉树通过多种遍历生成english_01.txt,一步步慢慢实现 lumber2388779 发表于 2017-4-19 17:44
先把创建插入删除二叉树的部分先实现出来,然后在修改成用英文字符和标点空格创建二叉树,再将二叉树通过 ...
#include <stdio.h>
#include <stdlib.h>
void main(){
int number=0,other=0,space=0;
char as,*ps;
int f;
FILE *fp;
if((fp=fopen("E:\\english.txt","r"))==NULL){
printf("cannot open file.\n");
exit(0);
}
fgets(as,499,fp);
fclose(fp);
for(int i=0;i<28;i++){
f=0;
for( ps=as;*ps!='\0';ps++)
if( *ps=='A'||*ps=='a')
f++;
else if( *ps=='B'||*ps=='b')
f++;
else if( *ps=='C'||*ps=='c')
f++;
else if( *ps=='D'||*ps=='d')
f++;
else if( *ps=='E'||*ps=='e')
f++;
else if( *ps=='F'||*ps=='f')
f++;
else if( *ps=='G'||*ps=='g')
f++;
else if( *ps=='H'||*ps=='h')
f++;
else if( *ps=='I'||*ps=='i')
f++;
else if( *ps=='J'||*ps=='j')
f++;
else if( *ps=='K'||*ps=='k')
f++;
else if( *ps=='L'||*ps=='l')
f++;
else if( *ps=='M'||*ps=='m')
f++;
else if( *ps=='N'||*ps=='n')
f++;
else if( *ps=='O'||*ps=='o')
f++;
else if( *ps=='P'||*ps=='p')
f++;
else if( *ps=='Q'||*ps=='q')
f++;
else if( *ps=='R'||*ps=='r')
f++;
else if( *ps=='S'||*ps=='s')
f++;
else if( *ps=='T'||*ps=='t')
f++;
else if( *ps=='U'||*ps=='u')
f++;
else if( *ps=='V'||*ps=='v')
f++;
else if( *ps=='W'||*ps=='w')
f++;
else if( *ps=='X'||*ps=='x')
f++;
else if( *ps=='Y'||*ps=='y')
f++;
else if( *ps=='Z'||*ps=='z')
f++;
else if( *ps<='9'&&*ps>='0')
number++;
else if(*ps==' ')
space++;
else other++;
}
printf("a=%d b=%d c=%d d=%d e=%d \n",f,f,f,f,f);
printf("f=%d i=%d j=%d k=%d l=%d \n",f,f,f,f,f);
printf("m=%d n=%d o=%d p=%d q=%d \n",f,f,f,f,f);
printf("r=%d s=%d t=%d u=%d v=%d \n",f,f,f,f,f);
printf("w=%d x=%d y=%d z=%d number=%d space=%d other=%d \n",f,f,f,f,f,f,number,space,other);
} 寻123 发表于 2017-4-26 09:46
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 10 // 带编码字符的个数,即树中叶结点的最大个数
#define M (2*N-1) // 树中总的结点数目
class HTNode{ // 树中结点的结构
public:
unsigned int weight;
unsigned int parent,lchild,rchild;
};
class HTCode{
public:
char data; // 待编码的字符
int weight; // 字符的权值
char code; // 字符的编码
};
void Init(HTCode hc[], int *n){
// 初始化,读入待编码字符的个数n,从键盘输入n个字符和n个权值
int i;
printf("input n = ");
scanf("%d",&(*n));
printf("\ninput %d character\n",*n);
fflush(stdin);
for(i=1; i<=*n; ++i)
scanf("%c",&hc.data);
printf("\ninput %d weight\n",*n);
for(i=1; i<=*n; ++i)
scanf("%d",&(hc.weight) );
fflush(stdin);
}//
void Select(HTNode ht[], int k, int *s1, int *s2){
// ht中选择parent为0,并且weight最小的两个结点,其序号由指针变量s1,s2指示
int i;
for(i=1; i<=k && ht.parent != 0; ++i){
; ;
}
*s1 = i;
for(i=1; i<=k; ++i){
if(ht.parent==0 && ht.weight<ht[*s1].weight)
*s1 = i;
}
for(i=1; i<=k; ++i){
if(ht.parent==0 && i!=*s1)
break;
}
*s2 = i;
for(i=1; i<=k; ++i){
if(ht.parent==0 && i!=*s1 && ht.weight<ht[*s2].weight)
*s2 = i;
}
}
void HuffmanCoding(HTNode ht[],HTCode hc[],int n){
// 构造Huffman树ht,并求出n个字符的编码
char cd;
int i,j,m,c,f,s1,s2,start;
m = 2*n-1;
for(i=1; i<=m; ++i){
if(i <= n)
ht.weight = hc.weight;
else
ht.parent = 0;
ht.parent = ht.lchild = ht.rchild = 0;
}
for(i=n+1; i<=m; ++i){
Select(ht, i-1, &s1, &s2);
ht.parent = i;
ht.parent = i;
ht.lchild = s1;
ht.rchild = s2;
ht.weight = ht.weight+ht.weight;
}
cd = '\0';
for(i=1; i<=n; ++i){
start = n-1;
for(c=i,f=ht.parent; f; c=f,f=ht.parent){
if(ht.lchild == c)
cd[--start] = '0';
else
cd[--start] = '1';
}
strcpy(hc.code, &cd);
}
}
int main()
{
int i,m,n,w;
HTNode ht;
HTCode hc;
Init(hc, &n); // 初始化
HuffmanCoding(ht,hc,n); // 构造Huffman树,并形成字符的编码
for(i=1; i<=n; ++i)
printf("\n%c---%s",hc.data,hc.code);
printf("\n");
return 0;
}
你能教我将上面的读取到的字母的频率应用到下面的哈弗曼代码中吗??我不会将两个连接在一起 斯蒂芬斯蒂芬斯蒂芬 寻123 发表于 2017-4-26 09:48
抱歉,最近比较忙,有空帮你看下
页:
[1]