哈夫蔓编码

cuzn 2003-09-19 01:13:39
各位大哥!求教哈夫蔓编码,谢谢了
...全文
126 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuzn 2003-09-21
  • 打赏
  • 举报
回复
多谢大家,要的就是这些
:)
kena 2003-09-19
  • 打赏
  • 举报
回复
//用c可以这样实现,包括哈夫曼树的创建、编码、解码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

typedef struct htnode{
unsigned int weight;
unsigned int parent,lchild,rchild;
}htnode,*htree;
typedef char * * huffmancode;

htree createhtree(int n)
{
htree ht;
htnode *p;
int i,m,*s1,*s2;
void select(htree ht,int i,int * l,int * r);
*s1=*s2=0;
if(n<=1)
return(NULL);
m=2*n-1;
ht=(htree)malloc((m+1)*sizeof(htnode));
for(p=ht+1,i=1;i<=n;i++,p++){
printf("\nInput the weight(%d):",i);
scanf("%d",&p->weight);
p->parent=p->lchild=p->rchild=0;
}
for(;i<=m;i++,p++)
p->weight=p->parent=p->lchild=p->rchild=0;
for(i=n+1;i<=m;i++){
select(ht,i,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;
}
return(ht);
}


void select(htree ht,int i,int * l,int * r)
{
int k,temp1,temp2;
temp1=temp2=32767;
*l=*r=0;
for(k=1;k<=i-1;k++){
if(ht[k].parent==0)
if(ht[k].weight<temp1){
temp2=temp1;
*r=*l;
temp1=ht[k].weight;
*l=k;
}
else if(ht[k].weight<temp2){
temp2=ht[k].weight;
*r=k;
}
}
}

void encode(htree ht,int n)
{
int i,c,f,start;
char * code;
huffmancode hc;
hc=(huffmancode)malloc((n+1)*sizeof(char *));
code=(char *)malloc(n*sizeof(char)); //store the huffmancode
code[n-1]='\0';
for(i=1;i<=n;i++){ // encode a huffman-tree from leaf to root
start=n-1;
for(c=i,f=ht[i].parent;f!=0;c=f,f=ht[f].parent)
if(ht[f].lchild==c)
code[--start]='0';
else
code[--start]='1';
hc[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(hc[i],&code[start]);
}
free(code);
printf("\n\nHuffman-code(with encode):");
for(i=1;i<=n;i++)
printf("\n%d: %s",i,hc[i]);
}

void decode(htree ht,int n)
{
int i,m,p,codelen;
char * code;
huffmancode hc;
hc=(huffmancode)malloc((n+1)*sizeof(char *));
code=(char *)malloc(sizeof(char));
m=2*n-1; codelen=0;p=m;
for(i=1;i<=m;++i)
ht[i].weight=0;
while(p){
if(ht[p].weight==0){
ht[p].weight=1;
if(ht[p].lchild!=0){
p=ht[p].lchild;
code[codelen++]='0';
}
else if(ht[p].rchild==0){
hc[p]=(char *)malloc((codelen+1)*sizeof(char));
code[codelen]='\0';
strcpy(hc[p],code);
// printf("\nhc[%d]:%s",p,hc[p]);
}
}
else if(ht[p].weight==1){
ht[p].weight=2;
if(ht[p].rchild!=0){
p=ht[p].rchild;
code[codelen++]='1';
}
}
else{ //ht[p].weight=2 , back
ht[p].weight=0;
p=ht[p].parent;
--codelen;
}

}
printf("\n\nHuffman-code(with denode):");
for(i=1;i<=n;i++)
printf("\n%d: %s",i,hc[i]);

}



void main()
{
htree ht;
int n,i;
clrscr();
printf("\nInput the number of the leaf-node");
scanf("%d",&n);
ht=createhtree(n);
printf("\nHT");
printf("\n weight parent lchild rchild");
for(i=1;i<=2*n-1;i++){
printf("\n");
printf("%2d %6d %6d %6d %6d",i,ht[i].weight,ht[i].parent,ht[i].lchild,ht[i].rchild);
}
encode(ht,n);
decode(ht,n);
}

kena 2003-09-19
  • 打赏
  • 举报
回复
//用c的话可以这样实现,可以实现哈夫曼树的创建、编码、解码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

typedef struct htnode{
unsigned int weight;
unsigned int parent,lchild,rchild;
}htnode,*htree;
typedef char * * huffmancode;

htree createhtree(int n)
{
htree ht;
htnode *p;
int i,m,*s1,*s2;
void select(htree ht,int i,int * l,int * r);
*s1=*s2=0;
if(n<=1)
return(NULL);
m=2*n-1;
ht=(htree)malloc((m+1)*sizeof(htnode));
for(p=ht+1,i=1;i<=n;i++,p++){
printf("\nInput the weight(%d):",i);
scanf("%d",&p->weight);
p->parent=p->lchild=p->rchild=0;
}
for(;i<=m;i++,p++)
p->weight=p->parent=p->lchild=p->rchild=0;
for(i=n+1;i<=m;i++){
select(ht,i,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;
}
return(ht);
}


void select(htree ht,int i,int * l,int * r)
{
int k,temp1,temp2;
temp1=temp2=32767;
*l=*r=0;
for(k=1;k<=i-1;k++){
if(ht[k].parent==0)
if(ht[k].weight<temp1){
temp2=temp1;
*r=*l;
temp1=ht[k].weight;
*l=k;
}
else if(ht[k].weight<temp2){
temp2=ht[k].weight;
*r=k;
}
}
}

void encode(htree ht,int n)
{
int i,c,f,start;
char * code;
huffmancode hc;
hc=(huffmancode)malloc((n+1)*sizeof(char *));
code=(char *)malloc(n*sizeof(char)); //store the huffmancode
code[n-1]='\0';
for(i=1;i<=n;i++){ // encode a huffman-tree from leaf to root
start=n-1;
for(c=i,f=ht[i].parent;f!=0;c=f,f=ht[f].parent)
if(ht[f].lchild==c)
code[--start]='0';
else
code[--start]='1';
hc[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(hc[i],&code[start]);
}
free(code);
printf("\n\nHuffman-code(with encode):");
for(i=1;i<=n;i++)
printf("\n%d: %s",i,hc[i]);
}

void decode(htree ht,int n)
{
int i,m,p,codelen;
char * code;
huffmancode hc;
hc=(huffmancode)malloc((n+1)*sizeof(char *));
code=(char *)malloc(sizeof(char));
m=2*n-1; codelen=0;p=m;
for(i=1;i<=m;++i)
ht[i].weight=0;
while(p){
if(ht[p].weight==0){
ht[p].weight=1;
if(ht[p].lchild!=0){
p=ht[p].lchild;
code[codelen++]='0';
}
else if(ht[p].rchild==0){
hc[p]=(char *)malloc((codelen+1)*sizeof(char));
code[codelen]='\0';
strcpy(hc[p],code);
// printf("\nhc[%d]:%s",p,hc[p]);
}
}
else if(ht[p].weight==1){
ht[p].weight=2;
if(ht[p].rchild!=0){
p=ht[p].rchild;
code[codelen++]='1';
}
}
else{ //ht[p].weight=2 , back
ht[p].weight=0;
p=ht[p].parent;
--codelen;
}

}
printf("\n\nHuffman-code(with denode):");
for(i=1;i<=n;i++)
printf("\n%d: %s",i,hc[i]);

}



void main()
{
htree ht;
int n,i;
clrscr();
printf("\nInput the number of the leaf-node");
scanf("%d",&n);
ht=createhtree(n);
printf("\nHT");
printf("\n weight parent lchild rchild");
for(i=1;i<=2*n-1;i++){
printf("\n");
printf("%2d %6d %6d %6d %6d",i,ht[i].weight,ht[i].parent,ht[i].lchild,ht[i].rchild);
}
encode(ht,n);
decode(ht,n);
}

金笛子 2003-09-19
  • 打赏
  • 举报
回复
#include "stdio.h"
#define MessMaxLen 128

typedef struct {
unsigned int weight;
unsigned int parent, lchild, rchild;
}HTNode;
typedef char **HuffmanCode;

char* InputMessage(){
int i=0;
char endsign,in,str[MessMaxLen];
printf("Please enter a (char) means end sign");
scanf("%c",&endsign);
printf("Input the (string), max length is %d (char)\n",MessMaxLen-2);
while((in=getch())!=endsign && i<126){
printf("%c[%d]\n",in,in);
str[i++]=in;
}
str[i]='\0';
return(str);
}

Numeration(char *message,char *letter,int *count,int *k){
int i, found;
for(;*message!='\0';message++){
i=0; found=0;
while(i<(*k) && !found){
if(*message==letter[i]){
count[i]++;
found=1;
}
i++;
}
if(!found){
letter[*k]=*message;
count[*k]=1;
(*k)++;
}/* if */
}/* for */
}/* sub */


HuffmanCoding(int *w, int n){
int c,i,f,m,s1=0,s2=0,start;
char *cd;
HTNode *p,*HT;
HuffmanCode HC;
if(n<=1) return;
m=2*n-1;
HT=(HTNode*)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1; i<=n; ++i,++p,++w){
p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;
}
for(; i<=m; ++i,++p){
p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;
}
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]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
i=i;
}
free(cd);
return(HC);
}

Select(HTNode *HT,int range,int *one,int *two){
int i,min1=0,min2=0;
for(i=1;i<=range;i++){
if(HT[i].parent==0){
if(HT[i].weight<=min1 || min1==0){
*two=*one; min2=min1;
*one=i; min1=HT[i].weight;
}else{
if(HT[i].weight<min2 || min2==0){
*two=i; min2=HT[i].weight;
}
}/* if */
}/* if */
}/* for */
}/* sub */



main(){
int i,j,k=0,found;
int count[MessMaxLen];
char letter[100];
char *message;
HuffmanCode HC;
message=InputMessage();
Numeration(message,letter,count,&k);

/*for(i=0;i<k;i++){
if(*(letter+i)==13)
printf("%c",10);
printf("%c %d\t",*(letter+i),*(count+i));
}*/

HC=HuffmanCoding(count,k);

for(i=1;i<=k;i++){
printf("%s ",HC[i]);
}printf("\n");

for(i=0;*(message+i)!='\0';i++){
found=0;
for(j=0;j<k && !found;j++){
if(*(message+i)==letter[j]){
printf("%s ",HC[j+1]);
found=1;
}
}
}
printf("\n");bioskey(0);
}

看 看
chuhang 2003-09-19
  • 打赏
  • 举报
回复
[问题描述]
利用哈夫曼编码进行通信可以大大提高通信信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统将传输数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双工传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼编/译码系统。
[基本要求]c++

#include<iostream.h>
const int n=5;
const int m=9;
const int infinity=32767;
struct node{
float weight;
int plink,llink,rlink;
};
struct codetype{
int start;
char bits[n+1];
};
struct element{
char symbol;
codetype code;
};
node tree[m+1];
element table[n+1];
int a[100];
void select(int s,int &x1,int &x2)
{int i;
float v1,v2;
v1=v2=infinity;
x1=x2=0;
for(i=1;i<=s;i++)
if(tree[i].plink==0)
if(tree[i].weight<v1)
{v2=v1;x2=x1;
v1=tree[i].weight;
x1=i;
}else if(tree[i].weight<v2)
{v2=tree[i].weight;
x2=i;
}
}
void sethuftree()
{ int i,x1,x2;
for(i=n+1;i<=m;i++)
{select(i-1,x1,x2);
tree[x1].plink=i;
tree[x2].plink=i;
tree[i].llink=x1;
tree[i].rlink=x2;
tree[i].weight=tree[x1].weight+tree[x2].weight;
}
}
void sethufcode()
{int i,s,f;
codetype c;
for(i=1;i<=n;i++)
{c.start=n+1;
s=i;
f=tree[s].plink;
do{c.start--;
if(s==tree[f].llink)
c.bits[c.start]='0';
else c.bits[c.start]='1';
s=f;
f=tree[s].plink;
}while(f);
table[i].code=c;
}
}
int getx()
{int x;
cout<<"please input a data:"<<endl;
cout<<"1:yima end with not'1'or'0'!"<<endl;
cout<<"0:back"<<endl;
cin>>x;
return(x);
}
int getcode()
{int i,n1;
char x;
cout<<"please input the code:"<<endl;
cin>>x;i=0;
while((x=='0')||(x=='1'))
{i++;
a[i]=x;
cin>>x;
}
n1=i;
return(n1);
}
void yimahuftree()
{int i,j,k,l,h,n2,y,flag;
codetype c;
k=1;i=1;
n2=getcode();
while(i<=n2)
{ flag=0;
for(j=1;j<=n;j++)
{ c=table[j].code;y=c.start;l=k;
while((a[l]==c.bits[y])&&(y<=n))
{ l++;y++; }
if(y==(n+1))
{cout<<table[j].symbol<<" ";
for(h=c.start;h<=n;h++)
cout<<c.bits[h];
cout<<"\n";
i=i+l-k;k=i;flag=1;
break;}
}
if(flag==0) i=i+1;
}
if(k!=n2+1)
cout<<"your put is out of the hufcode,and yima is error!"<<endl;
}
void main()
{int i,j,x;
codetype c;
for(i=1;i<=n;i++)
cin>>table[i].symbol>>tree[i].weight;
sethuftree();
sethufcode();
for(i=1;i<=n;i++)
{cout<<"\n";
cout<<table[i].symbol<<" ";
c=table[i].code;
for(j=c.start;j<=n;j++)
cout<<c.bits[j];
}
cout<<"\n";
while(1)
{ x=getx();
if(x==1)
{ yimahuftree();}
else if(x==0)
return;
}
}







psprite 2003-09-19
  • 打赏
  • 举报
回复
是要哪种编码啊
是单纯的huffman树吗》?
还是用于数据流压缩的huffman算法
用于文件压缩的huffman算法?
Anders911 2003-09-19
  • 打赏
  • 举报
回复
看书,各种数据结构的书都有涉及。问题不难,耐性一点。
gogo528 2003-09-19
  • 打赏
  • 举报
回复
各种数据结构书上面都有介绍啊!
jock_521 2003-09-19
  • 打赏
  • 举报
回复
有在网上搜索或者看书啊!这个问题太大了,不好回答啊!
hcj2002 2003-09-19
  • 打赏
  • 举报
回复
建议看看清华的数据结构书,上面讲的很详细。
njuhuangmy 2003-09-19
  • 打赏
  • 举报
回复
如果, 单纯 想知道 什么是 huffman 编码的话

在 google 上 搜索就 ok 了

如果 关于 huffman 编码有问题, 请具体一点
clarkralf 2003-09-19
  • 打赏
  • 举报
回复
先说什么问题?
doer_ljy 2003-09-19
  • 打赏
  • 举报
回复
什么不明白?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧