하프 만 트 리, 하프 만 인 코딩 과 디 코딩 실현 (c 언어)
51219 단어 데이터 구조
실험 항목: 하프 만 인 코딩 과 디 코딩 방법
하 프 만 인 코딩 은 하 프 만 트 리 (최 적 화 된 이 진 트 리, 권한 경로 길이 가 가장 작은 이 진 트 리) 를 바탕 으로 통계학 을 바탕 으로 하 는 긴 인 코딩 방식 이다.그 기본 사상 은 사용 횟수 가 많은 코드 를 길이 가 짧 은 인 코딩 으로 바 꾸 고 사용 횟수 가 적은 것 은 긴 인 코딩 을 사용 하 며 인 코딩 의 유일한 가용성 을 유지 하 는 것 이다.컴퓨터 정보 처리 에 서 는 데이터 압축 에 자주 사용 된다.일치 성 인 코딩 법 (일명 엔트로피 인 코딩 법) 으로 데이터 의 무 손실 압축 에 사용 된다.이 실험 은 욕심 산법 을 이용 하여 완전한 하프 만 인 코딩 과 디 코딩 시스템 을 실현 할 것 을 요구한다.
실험 내용 과 실험 요구:
#include
#include
#include
#define n 65
//
typedef struct{
char data;
int weight;
int lchild;
int rchild;
int parent;
}Htnode;
typedef Htnode HuffmanT[129];
//
typedef struct{
char ch; //
char bits[n+1]; //
}CodeNode;
typedef CodeNode HuffmanCode[n];
//0-9 ;10-35 ;36-61 ;62-64
void InitHT(HuffmanT T) //
{
char sz = '0';
char xzm = 'a';
char dzm = 'A';
char kong = ' ';
char dh = ',';
char jh = '.';
for(int i=0; i<n; i++)
{
T[i].lchild = T[i].rchild = T[i].parent = -1;
T[i].weight = 0;
if(i>=0&&i<=9)
{
T[i].data = sz;
sz++;
}
if(i>=10&&i<=35)
{
T[i].data = xzm;
xzm++;
}
if(i>=36&&i<=61)
{
T[i].data = dzm;
dzm++;
}
if(i>=62&&i<=64)
{
T[62].data = kong;
T[63].data = dh;
T[64].data= jh;
}
}
for(int j = n; j<2*n-1; j++)
{
T[j].weight = 0;
T[j].lchild = T[j].rchild = T[j].parent = -1;
}
printf("initHT over
");
}
void InputW(HuffmanT T) //
{
FILE *fp;
char ch;
char Filename[20];
printf ("input the filename:");
scanf("%s",Filename);
if((fp=fopen(Filename,"r"))==NULL) printf("faild
");
ch = fgetc(fp);
while(ch != EOF)
{
for(int i = 0; i<n; i++)
{
if(T[i].data == ch) T[i].weight++;
}
ch = fgetc(fp);
}
for(int i =0; i<n; i++)
{
printf("%c weight is:",T[i].data);
printf("%d
",T[i].weight);
// printf("%d,%d,%d
",T[i].parent,T[i].lchild,T[i].rchild);
}
fclose(fp);
printf("inputW over
");
}
void SelectMin(HuffmanT T, int length, int *p1, int *p2) // ,
{
int min1,min2; //min1 ,min2
int i=0;
int k,j=0;
for(j; j<length; j++)
{
if(T[j].parent == -1)
{
min1=j;
break;
}
}
for(k=min1+1;k<length;k++)
{
if(T[k].parent == -1)
{
min2 = k;
break;
}
}
// for(i = 0;i
while(i<length)
{
if(T[i].parent == -1)
{
if(T[i].weight<T[min1].weight)
{
min2 = min1;
min1 = i;
}
else if((i!=min1)&&(T[i].weight<T[min2].weight))
{
min2 = i;
}
}
i++;
}
// printf("%d,%d:%d,%d ",min1,min2,T[min1].weight,T[min2].weight);
*p1 = min1;
*p2 = min2;
// printf("selectmin
");
}
void CreartHT(HuffmanT T) //
{
int i,p1,p2;
int wei1,wei2;
InitHT(T); //
InputW(T); //
for(i=n; i<129; i++)
{
SelectMin(T,i,&p1,&p2);
wei1 = T[p1].weight;
wei2 = T[p2].weight;
T[p1].parent = i;
T[p2].parent = i;
T[i].lchild = p1;
T[i].rchild = p2;
T[i].weight = wei1 + wei2;
}
printf("creatHT over
");
}
void CharSetHuffmEncoding(HuffmanT T, HuffmanCode H) // H
{
int c,p,i; //c p T
char cd[n+1]; //
int start; // cd
cd[n]='\0'; //
for(i=0; i<n; i++)
{
H[i].ch = T[i].data;
start = n;
c=i;
while((p=T[c].parent)>=0) // T[c]
{
cd[--start] = (T[p].lchild==c) ? '0':'1'; //T[c] T[p] , 0 1
c=p;
}
strcpy(H[i].bits,&cd[start]);
}
printf("creatHcode over
");
}
void PHUM(char *file,char *s);
char s[30000]={3};
void PrintHUffmancode(HuffmanCode H) // txt
{
FILE *fp;
char ch;
char Filename[80];
char file[80];
printf ("output the Huffmancode of which file:");
scanf("%s",Filename);
if((fp=fopen(Filename,"r"))==NULL) printf("failda
");
ch = fgetc(fp);
int L =0;
printf("1");
while(ch != EOF)
{
for(int i = 0; i<n; i++)
{
if(H[i].ch == ch)
{
printf("%s",H[i].bits);
sprintf(s+L,"%s",H[i].bits);
L=strlen(s);
}
}
ch = fgetc(fp);
}
printf("
");
for(int k =0;k<n;k++)
{
printf("%c-%s
",H[k].ch, H[k].bits);
}
// printf("3
");
fclose(fp);
printf("stand by
");
PHUM(file,s);
}
void PHUM(char *file,char *s)
{
FILE *fp;
int i=0;
printf ("save your Huffmancode to the file:");
scanf("%s",file);
if((fp=fopen(file,"w"))==NULL) printf("faild
");
while(s[i]!='\0')
{
// fwrite(s,1,strlen(s),fp);
// fprintf(fp,'%c',s[i]);
fprintf(fp,"%c",s[i]);
i++;
}
fclose(fp);
printf("write over
");
}
void Printftxt(HuffmanT T,char a[]) // 0 1
{
int root,c;
int i = 0;
FILE *fp;
char ch;
char Filename[30];
printf ("print words acroding to Huffmancode:");
scanf("%s",Filename);
if((fp=fopen(Filename,"r"))==NULL) printf("faild
");
// printf("1
");
for(int j =0; j<129; j++) //
{
if(T[j].parent==-1)
{
root = j;
break;
}
}
ch=fgetc(fp);
while(ch!=EOF)
{
c=root;
while((T[c].lchild != -1) || (T[c].rchild != -1))
{
if(ch=='0')
{
c=T[c].lchild;
ch = fgetc(fp);
}
else if(ch=='1')
{
c=T[c].rchild;
ch = fgetc(fp);
}
// printf("2");
}
printf("%c",T[c].data);
// ch = fgetc(fp);
}
fclose(fp);
}
int main()
{
HuffmanT T;
HuffmanCode H;
CreartHT(T); //
CharSetHuffmEncoding(T,H); // ,
PrintHUffmancode(H); // ,
Printftxt(T,s); //
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.