哈夫曼树编码与译码
2018-01-08 19:20
441 查看
这是数据结构课程综合设计的一道题目,要求实现哈夫曼编码与译码。
题目三
哈夫曼编码/译码器
根据给定的一组电文,设计该电文的哈夫曼编码。
基本要求:
(1)初始化(Initialization):从终端读入字符集,大小n,随机产生包含n个字符的字符集存入文件中,然后统计每个字符出现的次数作为各字符的权值,以此建立哈夫曼树;
(2)编码(Coding):根据建立的哈夫曼树,对数据进行编码,然后将结果存入文件codefile中;
(3)译码(Decoding):利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入文件textfile中。
测试数据要求:
随机产生的字符要足够多,不允许手工输入。
【代码】
【测试运行】:
题目三
哈夫曼编码/译码器
根据给定的一组电文,设计该电文的哈夫曼编码。
基本要求:
(1)初始化(Initialization):从终端读入字符集,大小n,随机产生包含n个字符的字符集存入文件中,然后统计每个字符出现的次数作为各字符的权值,以此建立哈夫曼树;
(2)编码(Coding):根据建立的哈夫曼树,对数据进行编码,然后将结果存入文件codefile中;
(3)译码(Decoding):利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入文件textfile中。
测试数据要求:
随机产生的字符要足够多,不允许手工输入。
【代码】
#include<bits/stdc++.h> using namespace std; const int INF=1010100; struct node{ char ch; int val;//字符ch出现的次数 node *l,*r; }; void MakeStrFile(int n)//产生随机字符串文件(仅小写) { ofstream fout("str.txt"); while(n--){ char ch=rand()%26+'a'; cout<<ch; fout<<ch; } cout<<endl; fout.close(); } node* MakeTree()//构造哈夫曼树(同时生成映射数组M) { ifstream fin("str.txt"); int c[128]={0};//统计每隔字符出现的次数 for(char ch;fin>>ch;c[ch]++); node *vec[26];//结点的指针 int top=0; for 4000 (int i='a';i<='z';i++)if(c[i]) { node *p=new node; p->ch=i; p->val=c[i]; p->l=p->r=NULL; vec[top++]=p; } while(top>1)//构造哈夫曼树 { for(int i=top-2;i<top;i++)//把最小的两个元素移动到末尾 { for(int j=0;j<i;j++) if(vec[j]->val<vec[i]->val) swap(vec[j],vec[i]); } node *p=new node; p->ch='\0';//非叶子,空字符 p->val=vec[top-1]->val + vec[top-2]->val; p->l=vec[--top]; p->r=vec[--top]; //合并了结点 vec[top++]=p;//产生新父节点 } return vec[0];//根节点 } void MakeMap(node *rt,map<char,string> &Map,char s[],int deep) {//由树产生映射Map if(rt->ch == '\0')//非叶子 { s[deep]='0'; MakeMap(rt->l,Map,s,deep+1); s[deep]='1'; MakeMap(rt->r,Map,s,deep+1); } else //叶子 { s[deep]='\0'; Map[rt->ch]=string(s); cout<< rt->ch <<" "<< s <<endl; return; } } void Coding(char *str,char *code,node *rt) { ifstream fin(str); ofstream fout(code); map<char,string>M;//字符映射编码 char s[128]; cout<<"映射关系:"<<endl; MakeMap(rt,M,s,0);//由树产生映射 char ch; cout<<"编码:"<<endl; while(fin>>ch) { fout<<M[ch]; cout<<M[ch]; } cout<<endl; } void Decoding(char *code,char *out,node *rt)//译码 { node *p=rt; ifstream fin(code); ofstream fout(out); cout<<"译码:"<<endl; for(char ch;fin>>ch;) { p= ch=='0'? p->l:p->r; if(p->ch)//叶子 { fout<<p->ch; cout<<p->ch; p=rt;//回到根 } } cout<<endl; } int main() { srand(time(0)); int n; cout<<"输入随机字符串长度:"; cin>>n; MakeStrFile(n);//产生随机字符->str.txt node *rt=MakeTree();//生成哈夫曼树 Coding("str.txt","codefile.txt",rt);//编码form str to codefile Decoding("codefile.txt","textfile.txt",rt);//译码from codefile to textfile }
【测试运行】:
相关文章推荐
- C/C++ 哈夫曼树的构造、编码以及译码
- 哈夫曼树的初始化,编码,译码及横向打印
- C语言:哈夫曼树的编码与译码
- 优先级队列实现哈夫曼树的编码和译码
- [数据结构]课程设计--哈夫曼树编码与译码
- 哈夫曼树的初始化,编码,译码及横向打印
- 哈夫曼树构建,编码,译码的实现------数据结构
- 【数据结构】哈夫曼树实现编码译码
- 优先级队列实现哈夫曼树的编码和译码
- 电文的编码和译码(哈夫曼树的应用)
- 解析C++哈夫曼树编码和译码的实现
- 哈夫曼树编码与译码解码运用
- C++哈夫曼树编码和译码的实现
- 哈夫曼树的编码与译码
- 哈夫曼树的编码与译码(优化)
- 哈夫曼树的构造,编码,译码
- 哈夫曼树的编码和译码
- 数据结构:哈夫曼树,哈夫曼编码与译码系统
- 南邮数据结构、算法实践周基础题3(哈夫曼树及其编码)
- 哈弗曼编码和译码