if(m==h[i].ch){ for(int j=code[i].start;j //将输入的字符实现译码 void decoding(){ fstream fin(\ //读入要译码的文件 fstream fout(\ //将代码译码后放入到文件中 int a=0; char c[500],ch=NULL; int k=0,m=0,i=0; //将CodeFile.txt文件的编码读入 fin>>c; for(i=0;i } //选做1:实现印代码文件 void Print(){ fstream fin(\ fstream fout(\ char ch; int sum=0; cout<<\印代码文件输出如下:\ while(fin.get(ch)!=NULL){ //控制输出的字符个数 sum++; cout< //选做二:用递归算法实现哈夫曼树的直观输出 fstream fout(\ //建立存储的文件 void TreePrint(int m,int n){ //递归算法实现哈夫曼树的输出 if(h[m].weight==0.0) {return;} TreePrint(h[m].rchild,n+1); for(int i=0;i //主函数 void main(){ //界面设计 cout< cout<<'\\t'<<\ *********I:建哈夫曼树*********\ cout<<'\\t'<<\ *********E: 编码 *********\ cout<<'\\t'<<\ *********D: 译码 *********\ cout<<'\\t'<<\ *********P:印代码文件*********\ cout<<'\\t'<<\ *********T:印赫夫曼树*********\ cout<<'\\t'<<\ *********Q: 退出 *********\ cout<<'\\t'<<\ ---------------------------------------------------------\ char choose; cout<<\注意大写):\ cin>>choose; switch(choose){ //功能选择 case 'I':Initialization();break; //初始化哈夫曼树 case 'E':Encoding();break; //哈夫曼编码 case 'D':decoding();break; //哈夫曼译码 case 'P':Print();break; //印代码文件 case 'T':cout<<\输出的直观哈夫曼树如图:\ //哈夫曼树的树形输出 TreePrint(2*leaves-2,0); fout.close(); cout< 六、 调试分析 1) 测试一 ? 开始界面 利用输入输出控制,将页面设计的比较友好,但是只是简单利用输入输出,并未涉及很多的输入输出格式控制,有待提高。 ? 初始化哈夫曼树 先输入结点个数,并且字符支持输入空格字符,时间复杂度为o(n)。算法采用书本上的,无出现任何异常。只是可以进一步改进,加入异常处理机制,来处理异常的输入情况。 ? 哈夫曼编码 利用循序查找已有hfmtree文件中的字符实现编码的作用,时间复杂度最大为O(n*n),调试中主要出现读入字符的问题,刚开始想用字符数组存储结构,但是并不需这么复杂,只需一个一个读入再加以比较就好了。 ? 哈夫曼译码 译码属于这个程序中比较难得部分,因为其中涉及了字符串编码和字符编码的读入并且还需要一个一个加以比较。此程序主要利用将叶子结点一个一个的编码与取出的等长德字符串编码进行比较,相同则将字符保存进文件中,不同则进行下一项比较。时间复杂度视输入的字符数而定。此算法应该还能更加简化,减少其复杂度。 ? 印代码文件 主要就是将文件读入内存,然后加上一个换行判断标志即可。时间复杂度为O(n),n为字符串编码的个数。 ? 印哈夫曼树
赫夫曼编码(3)
2019-02-17 15:38
赫夫曼编码(3).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!