写的好烂,之后慢慢修,都在肝ctf

个人觉得那个两次进队一次出队连接哈夫曼结点的关系思想还行。

#include<stdio.h>
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
#include<algorithm>
#define MAXSIZE 2000
using namespace std;
struct HufStr{string word;int freq;string code;
};
bool isAlpha(char X){return ('A'<=X && X<='Z')||('a'<=X && X<='z');
}
struct HufNode
{bool flag;//1代表是字母结点int weight;HufNode *lch;HufNode *rch;HufStr* hf;//存放单词信息
};
//用于sort的比较函数
bool cmp(HufNode* a,HufNode* b)
{return a->weight>b->weight;
}
//以递归的方式对HufTree进行编码
void HufBinTreeCode(HufNode* r)
{if(r->lch!=NULL){r->lch->hf->code=r->hf->code;r->lch->hf->code.push_back('0');HufBinTreeCode(r->lch);}if(r->rch!=NULL){r->rch->hf->code=r->hf->code;r->rch->hf->code.push_back('1');HufBinTreeCode(r->rch);}return;
}
//负责建立各个结点的关系方便编码
HufNode* HuffmanCode(vector<HufStr*>&v)
{//开辟一个vector,存放树的结点vector<HufNode*> vhn;for(vector<HufStr*>::iterator it=v.begin();it!=v.end();it++){HufNode* hn=new HufNode;hn->weight=(*it)->freq;hn->hf=(*it);hn->lch=NULL;hn->rch=NULL;hn->flag=true;vhn.push_back(hn);}sort(vhn.begin(),vhn.end(),cmp);vector<HufNode*> vcopy(vhn);HufNode *r;//建立各个结点间的关系while(true){//从备份容器中取出两个最小的,因为排序了,所以取最后的就行了//然后创建一个父节点连接他们,把父节点放进去,如果容器里只有一个元素了就退出,这个元素即是根节点HufNode* temp=new HufNode;temp->hf=new HufStr;temp->flag=0;HufNode* a=vcopy.back();temp->lch=a;vcopy.pop_back();HufNode* b=vcopy.back();temp->rch=b;vcopy.pop_back();temp->weight=a->weight+b->weight;temp->hf->code="B";vcopy.push_back(temp);sort(vcopy.begin(),vcopy.end(),cmp);if(vcopy.size()==1){r=vcopy.back();break;}}//进行编码HufBinTreeCode(r);//输出到 output文件里ofstream ofs;ofs.open("code.txt",ios::out);for(vector<HufNode*>::iterator it=vhn.begin();it!=vhn.end();it++){ofs.width(19);ofs.setf(ios::left);ofs<<(*it)->hf->word;ofs.width(5);ofs.setf(ios::left);ofs<<":";ofs.width(5);ofs.setf(ios::left);ofs<<(*it)->hf->freq<<":";ofs<<(*it)->hf->code<<endl;}ofs.close();return r;
}
//文本转换成编码
string ConvToCode(string s,vector<HufStr*> &v)
{for(vector<HufStr*>::iterator it=v.begin();it!=v.end();it++){if(s==(*it)->word)return (*it)->code;}return "Not Find";
}
//编码转换成文本
string ConvToText(string s,vector<HufStr*> &v)
{for(vector<HufStr*>::iterator it=v.begin();it!=v.end();it++){if(s==(*it)->code)return (*it)->word;}return "Not Find";
}
//文章转换成编码
void EssayToCode(vector<HufStr*> &v)
{ifstream ifs;ifs.open("text.txt",ios::in);ofstream ofs;ofs.open("EssayToCode.txt",ios::out);int row=0;while(row<4){char buf[2000];int i=0;ifs.getline(buf,MAXSIZE);while(true){string temp="";while(isAlpha(buf[i])){temp.push_back(buf[i]);i++;}if(temp!="")ofs<<ConvToCode(temp,v);while(!isAlpha(buf[i])){ofs<<buf[i];i++;}if(i>=strlen(buf))break;}row++;ofs<<endl;}}
//编码转换成文本
void EssayDecode(vector<HufStr*> &v)
{ifstream ifs;ifs.open("EssayToCode.txt",ios::in);ofstream ofs;ofs.open("EssayDecode.txt",ios::out);int row=0;while(row<2){char buf[2000];int i=0;ifs.getline(buf,MAXSIZE);while(true){string temp="B";i++;//while((buf[i])!='B')//i++;while(buf[i]=='0'||buf[i]=='1'){temp.push_back(buf[i]);i++;}if(temp!="B")ofs<<ConvToText(temp,v);while(buf[i]!='0' && buf[i]!='1'&& buf[i]!='B'&&i<strlen(buf)){ofs<<buf[i];i++;}if(i>=strlen(buf))break;}row++;ofs<<endl;}}
void DestoryTree(HufNode* r)
{if(r->lch!=NULL)DestoryTree(r->lch);if(r->rch!=NULL)DestoryTree(r->rch);delete r;
}
int main()
{ifstream ifs;vector<HufStr*> v;ifs.open("text.txt",ios::in);bool flag=true;while(ifs.eof()==false){char buf[2000];int i=0,j=0;ifs.getline(buf,MAXSIZE);while(true){HufStr *hf=new HufStr;//v.push_back(hf);hf->word="";hf->code="";//存储单词while(isAlpha(buf[j])){hf->word.push_back(buf[j]);j++;}i=j;bool flag=true;// 判断这个单词之前出现过没,如果出现过,次数增加,删除这个单词for(vector<HufStr*>::iterator it=v.begin();it!=v.end();it++){if((*it)->word==hf->word||hf->word==""){(*it)->freq++;flag=false;delete hf;break;}}//没出现过if(flag){v.push_back(hf);hf->freq=1;}while(!isAlpha(buf[i])&&i<MAXSIZE)i++;j=i;if(j>=strlen(buf))break;}}HufNode* r= HuffmanCode(v);cout<<ConvToCode("data",v)+" "+ConvToCode("Structure",v);EssayToCode(v);EssayDecode(v);DestoryTree(r);//释放内存return 0;
}

[已迁移]数据结构-霍夫曼编码相关推荐

  1. 【数据结构】图解霍夫曼编码,看了就能懂

    今天来给大家普及一下霍夫曼编码(Huffman Coding),一种用于无损数据压缩的熵编码算法,由美国计算机科学家大卫·霍夫曼在 1952 年提出--这么专业的解释,不用问,来自维基百科了. 说实话 ...

  2. 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码

    一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60,    B:45,   C:13   D:69   E ...

  3. 数据结构与算法之霍夫曼编码解码实现

    目标:将字符串"can you can a can as a can canner can a can."编码再解码 流程: 将字符串转成bytes (byte[]格式)(eg.[ ...

  4. 可逼近信道容量编码技术之霍夫曼编码的实现

    可逼近信道容量编码技术之霍夫曼编码的实现 简介 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视.哈夫曼编码正是一种应用广泛且非常有效 ...

  5. 哈夫曼编码译码 C语言,【求助】严蔚敏版数据结构 哈夫曼编码译码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include typedef char* HuffmanCode;/*动态分配数组,存储哈夫曼编码*/ typed ...

  6. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  7. 信息论 哈夫曼编码 与 菲诺编码的实现(对一幅BMP格式的灰度图像(个人 证件照片)进行二元霍夫曼编码和译码。并进行编码效率的计算,对一幅BMP格式的灰度图像进行二 元Fano编码、译码 )

    信息论 哈夫曼编码 与 菲诺编码的实现(对一幅BMP格式的灰度图像(个人 证件照片)进行二元霍夫曼编码和译码.并进行编码效率的计算,对一幅BMP格式的灰度图像进行二 元Fano编码.译码 ) 原始图片 ...

  8. 程序员的算法课(8)-贪心算法:理解霍夫曼编码

    一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...

  9. Zlib压缩算法:LZ77、LZ78、霍夫曼编码、滑动窗口、Rabin-Karp算法、哈希链、I/O缓冲区

    Table of Contents 1.简介 1.1 什么是zlib 2.压缩算法 2.1 放气 2.2 LZ77 2.2.1 滑动窗口 2.2.2 长距离对 2.3 霍夫曼编码 3. zlib的实现 ...

最新文章

  1. 显卡不够时,如何训练大型网络
  2. “Hello,Jetpack”:构建您的第一个Jetpack应用程序
  3. 复合非聚集索引里列的顺序的重要性
  4. 通过源码分析MyBatis的缓存
  5. cobaltstrick4.0系列教程(2)---用户接口
  6. HDU-4027 Can you answer these queries? --线段树
  7. 数据产品-数据分析方法论和分析方法介绍
  8. python数据处理随笔总结
  9. Python机器学习:KNN算法06网格搜索
  10. 《小米网抢购系统开发实践》读后感
  11. Windows Server AppFabric正式发布
  12. 单片机学习——定时器/计数器
  13. 嵌入式--需要懂的网站
  14. ContentNegotiation内容协商机制(一)---Spring MVC内置支持的4种内容协商方式【享学Spring MVC】
  15. Mac 清理垃圾工具 Clean My Mac破解版
  16. 开发人员的十种必备工具
  17. Rhythmbox中文乱码解决
  18. 产品策划流程体系、工具
  19. Vue----登录主页动态背景短视频制作
  20. 曝光量的计算方式是什么?

热门文章

  1. 五种JavaScript富文本编辑器,总有一款适合你
  2. 【校招Verilog手撕代码】VL6、CRC-8校验码
  3. 计算机的起源与发展历程
  4. 英语翻译作业(十七)
  5. Linux——定时运行作业
  6. 西安临潼秦始皇陵、地宫、八大奇迹馆、骊山一日游
  7. 服务器主板插显卡进不了系统,关于换了显卡后进不了系统的问题
  8. 大数据时代网络安全分析
  9. 【springboot错误】 Failed to instantiate [org.springframework.transaction.interceptor.BeanFactoryTransac
  10. 行业垂直型SaaS进击蓝海 中国版Salesforce潜藏何处