社区
数据结构与算法
帖子详情
有关哈夫曼编码的简单问题
xrbeck
2002-01-16 03:53:50
哈夫曼算法似乎只是解决通信字符的构造问题?是吗?
另外他这个似乎只是构造出了字符的前缀。
那么后面应该是什么?
比如说a的前缀是01.那么a的整个字符串应该是。。。
书上提到的"任一个字符的编码都不是另一个字符的
编码的前缀"是什么意思。。
谢谢大家
...全文
223
11
打赏
收藏
有关哈夫曼编码的简单问题
哈夫曼算法似乎只是解决通信字符的构造问题?是吗? 另外他这个似乎只是构造出了字符的前缀。 那么后面应该是什么? 比如说a的前缀是01.那么a的整个字符串应该是。。。 书上提到的"任一个字符的编码都不是另一个字符的 编码的前缀"是什么意思。。 谢谢大家
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ringphone
2002-01-17
打赏
举报
回复
比如a是110,B是011。那么如果出现的是0110。。那这个不是冲突了么。。
哈夫曼是基于流的,0110读到011,已经解码出B了,剩下的0是下一个编码的开头了。
xrbeck
2002-01-17
打赏
举报
回复
Hi.我想把上面这个提到的问题搞搞懂。就是这个a,b的问题是怎么回事呢,谢谢。
xrbeck
2002-01-17
打赏
举报
回复
哦。。这样。谢谢了。
晨星
2002-01-16
打赏
举报
回复
这样,电话交换机就可以方便的定位,人们也可以方便的使用,相反,假如某个人的家里电话是11054321,当别人拨他家的电话时,如果拨完了110,后面的五位忘记了,那么还不等他去查,派出所就接了。
晨星
2002-01-16
打赏
举报
回复
事实上,我们的电话号码就是前缀码,119是个合法的电话号码,因此就没有任何一个其它的电话号码以119开头。又如,95555是个合法的号码,也没有第二个电话以95555开头。
xrbeck
2002-01-16
打赏
举报
回复
哦。才看到阿虎兄的程序。不过我现在还没有开始写。
想先搞搞懂。谢谢了。
xrbeck
2002-01-16
打赏
举报
回复
哦。可是我刚才想到个问题。
比如a的前缀是11。B的是01,
可是比如a是110,B是011。那么如果出现的是0110。。那这个不是冲突了么。。
andy_lau
2002-01-16
打赏
举报
回复
共同进步
//////////////////////////////////////////////////////////////////////////////////
题目要求:1)建立一正文文件(本程序中建立的文件名文test.txt),向其中输入字符(本程序中可输入任意ASCII值)
2)通过哈夫曼算法求出文件中字符的相应编码
3)建立一与正文文件(test.txt)对应的编码文件(本程序中为bainma.txt)
//////////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include<alloc.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
/*声明两种链表结构----start*/
struct node_a{ /*链表1-----作用:用来统计文件中字符的个数和种类(通过count)*/
char data;
int count;
struct node_a *next;
};
typedef struct node_a node,*list;
list head=NULL;
struct nodeb{ /*链表2-----作用:用来建立用相应的编码代替字符的新文件*/
char data;
struct nodeb *next;
};
typedef struct nodeb node_b,*list_b; /*jiang bianma xieru wenjian*/
list_b head_b=NULL;
/*声明两种链表结构----end*/
/*哈夫曼算法种相关的3种结构的声明-----start*/
struct forest{
float weight;
int root;
};
struct alphabet{
char symbol;
float probability;
int leaf;
char *bianma;
};
struct tree{
int lchild;
int rchild;
int parent;
};
typedef struct tree *tree_ptr,tree_node;
typedef struct forest *forest_ptr,forest_node;
typedef struct alphabet *alphabet_ptr,alphabet_node;
tree_ptr tree1;
forest_ptr forest1;
alphabet_ptr alphabet1;
int lasttree,lastnode;
int least,second;
/*哈夫曼算法种相关的3种结构的声明-----end*/
/**************stack difination start****************/
struct stacknode{
char *bian_ma;
struct stacknode *next;
};
typedef struct stacknode stack_node;
typedef stack_node *link;
link top=NULL;
void push(char *item){
link p;
if(top!=NULL){
p=(link)malloc(sizeof(stack_node));
if(p==NULL){
printf("Memory allocation error!");
return;
}
p->bian_ma=item;
p->next=top;
top=p;
}
else{
top=(link)malloc(sizeof(stack_node));
if(!top){
printf("Memory allocation error!");
return;
}
top->bian_ma=item;
top->next=NULL;
}
}
void pop(void){
link p;
p=top;
top=top->next;
free(p);
}
void makenull(void){
while(top!=NULL)
pop();
}
int empty(){
if(top==NULL)
return 1;
else
return 0;
}
char* tops(void){
return (top->bian_ma);
}
void display_stack(link s){ /*显示栈重的内容*/
link ptr;
ptr=s;
while(ptr!=NULL){
printf("%s",ptr->bian_ma);
ptr=ptr->next;
}
}
/***************************stack__difination is end************************/
void display(list h){ /*显示链表1*/
list ptr;
int i=1;
ptr=h->next;
while(ptr!=NULL){
printf("%d,%c,%d\n",i,ptr->data,ptr->count);
i++;
ptr=ptr->next;
}
}
void display_b(list_b h){ /*显示链表2*/
list_b ptr;
int i=1;
ptr=h->next;
while(ptr!=NULL){
printf("%d,%c\n",i,ptr->data);
i++;
ptr=ptr->next;
}
}
void insert(char item){ /*用于插入元素以建立链表1*/
list temp,ptr;
int flag;
ptr=head->next;
if(ptr==NULL){
head->next=(list)malloc(sizeof(node));
head->next->data=item;
head->next->count=1;
head->next->next=NULL;
}
else{
while(ptr!=NULL){
if(ptr->data==item){
ptr->count=ptr->count+1;
flag=1;
}
ptr=ptr->next;
}
ptr=head;
if(flag==1)
return;
else{
temp=ptr->next;
ptr->next=(list)malloc(sizeof(node));
ptr->next->data=item;
ptr->next->count=1;
ptr->next->next=temp;
}
}
}
void insert_b(char item){ /*插入元素以建立链表2*/
list_b ptr_b,temp_b;
ptr_b=head_b;
if(ptr_b->next==NULL){
head_b->next=(list_b)malloc(sizeof(node_b));
head_b->next->data=item;
head_b->next->next=NULL;
}
else{
while(ptr_b->next!=NULL){
ptr_b=ptr_b->next;
}
ptr_b->next=(list_b)malloc(sizeof(node_b));
ptr_b->next->data=item;
ptr_b->next->next=NULL;
}
}
void search(void){ /*搜索文件并将文件中的数据分别存入作用不同的链表中*/
FILE *fp;
list ptr;
char ch;
if((fp=fopen("test.txt","r"))==NULL)
printf("Reading error!\n");
while(!feof(fp)){
ch=getc(fp);
if(ferror(fp)){
printf("error!\n");
break;
}
if(ch==EOF)
break;
insert(ch); /*插入元素进链表1*/
insert_b(ch); /*插入元素进链表2*/
}
printf("\n");
fclose(fp);
}
void display_struct(int n){ /*显示哈夫曼算法中的3个结构树组 */
int i=0;
printf("\n\n=======================================\n\n");
printf("FOREST_STRUCT_ARRY :\n\n\n");
for(i=0;i<=n;i++){
printf("%f,%d\n",forest1[i].weight,forest1[i].root);
}
getch();
printf("\n\nALPHABET_STRUCT_ARRY :\n\n\n");
for(i=0;i<=n;i++){
printf("%f,%d,%c\n",alphabet1[i].probability,alphabet1[i].leaf,alphabet1[i].symbol);
}
getch();
printf("\n\nTREE_STRUCT_ARRY :\n\n\n");
for(i=0;i<=2*n-1;i++)
printf("%d,%d,%d\n",tree1[i].lchild,tree1[i].rchild,tree1[i].parent);
printf("\n\n======================================\n\n");
getch();
}
int init_struct(void){ /*初始化哈夫曼算法中3种结构数组*/
list ptr;
float count=.0;
int i=1,n=0;
ptr=head->next;
while(ptr!=NULL){
count=ptr->count+count;
n++;
ptr=ptr->next;
}
ptr=head->next;
forest1=(forest_ptr)malloc(sizeof(forest_node)*n+sizeof(forest_node));
alphabet1=(alphabet_ptr)malloc(sizeof(alphabet_node)*n+sizeof(alphabet_node));
tree1=(tree_ptr)malloc(sizeof(tree_node)*n*2-sizeof(tree_node));
forest1[0].weight=alphabet1[0].probability=0.0;
forest1[0].root=alphabet1[0].leaf=0;
alphabet1[0].symbol='0';
while(ptr!=NULL){
forest1[i].weight=alphabet1[i].probability=ptr->count/count;
forest1[i].root=alphabet1[i].leaf=i;
alphabet1[i].symbol=ptr->data;
i++;
ptr=ptr->next;
}
for(i=0;i<=2*n-1;i++){
tree1[i].lchild=0;
tree1[i].rchild=0;
tree1[i].parent=0;
}
return n;
}
void creat(void){ /*创建正文文件test.txt*/
FILE *fp,*out;
char ch;
if((fp=fopen("test.txt","w+t"))==NULL)
printf("Creat error!\n");
printf("Input the data:\n");
ch=getch();
putch(ch);
while(ch!='#'){
putc(ch,fp);
ch=getch();
putch(ch);
}
fclose(fp);
}
void creat_bianma(int number){ /*根据哈夫曼算法建立文件中各种字符对应的编码*/
int i,j,n;
int p;
char *bm=malloc(sizeof(char)*number);
for(n=1;n<=number;n++){
j=i=n;
makenull();
p=tree1[i].parent;
while(tree1[p].parent!=0){
if(tree1[p].lchild==i)
push("0");
else
push("1");
i=p;
p=tree1[p].parent;
}
if(tree1[p].lchild==i)
push("0");
else
push("1");
strcpy(bm," "); /*目的:使创建编码文件中的各编码中间存在间隔*/
while(!empty()){
strcat(bm,tops());
pop();
}
alphabet1[j].bianma=malloc(sizeof(char)*number);
strcpy(alphabet1[j].bianma,bm);
printf("\n%c:%s",alphabet1[j].symbol,alphabet1[j].bianma); /*打印出相应的编码*/
getch();
}
}
void write_new_file(int number){ /*根据相应的编码重新建立编码文件*/
FILE *fp;
list_b ptr;
int i;
char *ch=malloc(sizeof(char)*number);
ptr=head_b->next;
if((fp=fopen("bianma.txt","w"))==NULL)
printf("Write in a new file error!");
else{
while(ptr!=NULL){
for(i=1;i<=number;i++){
if(ptr->data==alphabet1[i].symbol){
strcpy(ch,alphabet1[i].bianma);
fputs(ch,fp);
}
}
ptr=ptr->next;
}
}
fclose(fp);
}
void main(void){
int i,num;
char ch;
void huffman(void);
void lightones();
head=(list)malloc(sizeof(node));
head->next=NULL;
head->data='';
head->count=0;
head_b=(list_b)malloc(sizeof(node_b));
head_b->data='';
head_b->next=NULL;
do{
system("cls");
creat();
search();
printf("\nlianbiao1:\n");
display(head);/*显示链表1*/
getch();
printf("\nlianbiao2:\n");
display_b(head_b);
getch();
num=init_struct();
printf("\n");
printf("The 3 init_struct of huffman?\n");
display_struct(num);/*显示初始化的哈夫曼书的相关3个结构数组*/
lastnode=num;
lasttree=num;
huffman();
printf("Now the 3 struct through huffman shuanfa\n");
display_struct(num);/*显示哈夫曼树中相关的3种结构(经过哈夫曼算法处理)*/
printf("\nThe bian_ma is:\n");
creat_bianma(num);
write_new_file(num);
printf("\nDo you want to re_try(y/n)?");
ch=getchar();
}while(ch=='y');
}
/*哈夫曼算法-----defination_start*/
void lightones(void){
int i;
if(forest1[1].weight<=forest1[2].weight){
least=1;
second=2;
}
else{
least=2;
second=1;
}
for(i=3;i<=lasttree;i++)
if(forest1[i].weight<forest1[least].weight){
second=least;
least=i;
}
else
if(forest1[i].weight<forest1[second].weight)
second=i;
}
int creat_tree(int lefttree,int righttree){
lastnode=lastnode+1;
tree1[lastnode].lchild=forest1[lefttree].root;
tree1[lastnode].rchild=forest1[righttree].root;
tree1[lastnode].parent=0;
tree1[forest1[lefttree].root].parent=lastnode;
tree1[forest1[righttree].root].parent=lastnode;
return(lastnode);
}
void huffman(void){
int i,j;
int newroot;
while(lasttree>1){
lightones();
i=least;
j=second;
newroot=creat_tree(i,j);
forest1[i].weight=forest1[i].weight+forest1[j].weight;
forest1[i].root=newroot;
forest1[j]=forest1[lasttree];
lasttree=lasttree-1;
}
}
/*哈夫曼算法-----defination end*/
编译环境:windows_2000P TURBOC_2.0
(andy_lau草编于2001-12-9)
gcd0318
2002-01-16
打赏
举报
回复
类似长途电话的区号,只要没有成为一个代码串就不会有重复的。
任一个字符的编码都不是另一个字符的编码的前缀,意思是不会出现比如A是001而B是0010的情况,因为这时001001001……无法确定到底是什么串,因为不知道每个代码串的长度——哈夫曼编码是个不定长度的编码。
gcd0318
2002-01-16
打赏
举报
回复
类似长途电话的区号,只要没有成为一个代码串就不会有重复的。
任一个字符的编码都不是另一个字符的编码的前缀,意思是不会出现比如A是001而B是0010的情况,因为这时001001001……无法确定到底是什么串,因为不知道每个代码串的长度——哈夫曼编码是个不定长度的编码。
me262cn
2002-01-16
打赏
举报
回复
HuffMan构造的是字符代码,因为HuffMan编码根据字符频率记数表构造一个二叉树,每个字符的代码就是根到叶的路径代码,所以任一个字符的编码都不是另一个字符的
编码的前缀。
简单
哈夫曼编码
实例
哈夫曼编码
的
简单
实例,对a-e 5个字母进行编码,随机生成0-30个 a-e 的字母序列,对其进行编码和解码。带可视化界面。
数据结构
哈夫曼编码
实验报告.doc
一、【
问题
描述】 利用
哈夫曼编码
进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本 。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数 据进行译码,此实验即设计这样...
哈夫曼编码
解码的可视化界面实现
java语言、
简单
实现了
哈夫曼编码
、解码的可视化界面。
哈夫曼编码
C++实现
用C++写的一个
简单
的
哈夫曼编码
的.cpp文件,放在这希望对大家有帮助,这是我的一个课程设计的文件,感觉还行吧。
哈夫曼编码
在哈夫曼树的基础上进行
哈夫曼编码
设计
本文主要针对输入的十个整型数,进行归一化之后,构建合适的哈夫曼树,在哈夫曼树的基础上进行
哈夫曼编码
设计,并就构造哈夫曼树和进行
哈夫曼编码
的算法进行了较为细致的描述。本文另附二叉树的遍历搜索源码,较为...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章