当前位置: 首页 > news >正文

网站后台上传图片步骤天津网站排名提升

网站后台上传图片步骤,天津网站排名提升,亚马逊免费视频,大理州城乡建设局官方网站这几天在较为认真的研究基于哈夫曼编码的文件压缩及解压#xff0c;费了点时间#xff0c;在这分享一下#xff1a; 这里用链式结构#xff0c;非顺序表结构#xff1b; 文件压缩#xff1a; 1.获取文件信息#xff08;这里采用TXT格式文本#xff09;#xff1b; 2.压… 这几天在较为认真的研究基于哈夫曼编码的文件压缩及解压费了点时间在这分享一下 这里用链式结构非顺序表结构 文件压缩 1.获取文件信息这里采用TXT格式文本 2.压缩文件 3.写配置文件便于解压时用无非就是存放原文件的索引之类的比如说文件中某个字符出现的个数记录下来 4.解压缩使用压缩后的文件和配置文件解压文件 5.用比对软件比对解压后的文件和源文件是否相同 下面慢慢解析 先看一个文件信息类 typedef long long LongType; struct FileInfo {unsigned char _ch; //字符LongType _count; //字符出现次数string _code; //字符对应的哈夫曼编码 FileInfo(unsigned char ch 0):_ch(ch),_count(0){}FileInfo operator(const FileInfo x){FileInfo tmp;tmp._count this-_count x._count;return tmp;}bool operator !(const FileInfo x) const{return this-_count ! x._count;} };bool operator(const FileInfo info1,const FileInfo info2) {return info1._count info2._count; }此为一个文件信息的类结构包含字符字符对应出现的次数以及这个字符对应的哈夫曼编码能看到这篇博客的星弟对哈夫曼编码不会陌生这里不再强调 除了统计字符出现的次数及哈夫曼编码还完成了几个运算符的重载 要获取哈夫曼编码就得建立哈夫曼树建立哈夫曼树用最小堆取操作以下是最小堆建立过程 // 小堆 templateclass T struct Less {bool operator() (const T l, const T r){return l r; // operator}};templateclass T struct Greater {bool operator() (const T l, const T r){return l r; // operator} };templateclass T, class Compare LessT class Heap { public:Heap(){}Heap(const T* a, size_t size){for (size_t i 0; i size; i){_arrays.push_back(a[i]);}// 建堆for(int i (_arrays.size()-2)/2; i 0; --i){AdjustDown(i);}}void Push(const T x){_arrays.push_back(x);AdjustUp(_arrays.size()-1);}void Pop(){assert(_arrays.size() 0);swap(_arrays[0], _arrays[_arrays.size() - 1]);_arrays.pop_back();AdjustDown(0);}T Top(){assert(_arrays.size() 0);return _arrays[0];}bool Empty(){return _arrays.empty();}int Size(){return _arrays.size();}void AdjustDown(int root){int child root*2 1;// Compare com;while (child _arrays.size()){// 比较出左右孩子中小的那个if (child1_arrays.size() *_arrays[child1] _arrays[child])//if(child1_arrays.size() // com(_arrays[child1],_arrays[child])){child;}if(*_arrays[child] _arrays[root])//if(com(_arrays[child],_arrays[root])){swap(_arrays[child], _arrays[root]);root child;child 2*root1;}else{break;}}}void AdjustUp(int child){int parent (child-1)/2;//while (parent 0)while (child 0){if (*_arrays[child] _arrays[parent]){swap(_arrays[parent], _arrays[child]);child parent;parent (child-1)/2;}else{break;}}}public:vectorT _arrays; };最小堆里也完成了很多接口包括push  pop等 然后就是几个压缩和解压的函数接口 1.根据哈夫曼树获取哈夫曼变慢 void _GenerateHuffmanCode(HuffmanTreeNodeFileInfo* root){if (root nullptr){return;}_GenerateHuffmanCode(root-_left);_GenerateHuffmanCode(root-_right);//当前节点为叶子节点为空 才生成哈夫曼编码if (root-_left nullptr root-_right nullptr){HuffmanTreeNodeFileInfo* cur root;HuffmanTreeNodeFileInfo* parent cur-_parent;string code _infos[cur-_weight._ch]._code;while (parent){if (parent-_left cur){code 1;}else if (parent-_right cur){code 0;}cur parent;parent cur-_parent;}reverse(code.begin(), code.end());}} 2.根据最小堆建立哈夫曼树 void CreateTree(T *a, size_t size, const T invalid){assert(a);HeapHuffmanTreeNodeT* s1; //草 终于发现问题 在这里 堆里放的是指针类型一定要对//找两个最小的元素for (size_t i 0; i size; i){if (a[i] ! invalid){HuffmanTreeNodeT* node new HuffmanTreeNodeT(a[i]);s1.Push(node);}}while (s1.Size() 1){HuffmanTreeNodeT* left s1.Top();s1.Pop();HuffmanTreeNodeT* right s1.Top();s1.Pop();HuffmanTreeNodeT* parent new HuffmanTreeNodeT(left-_weight right-_weight);parent-_left left;parent-_right right;left-_parent parent;right-_parent parent;s1.Push(parent);}_root s1.Top();s1.Pop();} 3.读取文本文件中的一行 bool _ReadLine(FILE *fOutLogFile, string line){char ch fgetc(fOutLogFile);if (feof(fOutLogFile))return false;else{if (ch \n){line ch;ch fgetc(fOutLogFile);}while (ch ! \n){line ch;ch fgetc(fOutLogFile);}return true;}} 4.文件压缩 //文件压缩bool Compress(const char* filename){//1.打开一个文件统计文件字符出现的次数//2.生成对应的哈弗曼编码//3.压缩文件//4.写配置文件方便解压缩assert(filename);FILE *fOut fopen(filename, rb);assert(fOut);//统计文件字符出现的次数unsigned char ch fgetc(fOut);while (!feof(fOut)) //文件结束{_infos[ch]._count;ch fgetc(fOut);}HuffmanTreeFileInfo ht;FileInfo invalid;ht.CreateTree(_infos, 256, invalid);//哈夫曼编码_GenerateHuffmanCode(ht.GetRoot());string compressFile filename;compressFile .huf;//压缩后的文件名 后缀为《输入文件名.huf》FILE *finCompress fopen(compressFile.c_str(), wb); //获取string中的C字符串assert(finCompress);fseek(fOut, 0, SEEK_SET);//将文件指针移到开头char cha fgetc(fOut);unsigned char inch 0;int index 0; //一个字节的八位while (!feof(fOut)){string code _infos[(unsigned char)cha]._code;for (size_t i 0; i code.size(); i){inch 1; //低位向高位进if (code[i] 1){inch | 1;}if (index 8){fputc(inch, finCompress); //够8位装进文件index 0; //重新一轮开始inch 0;}}cha fgetc(fOut);}fclose(fOut);//如果index 0 说明 上边8位刚好存满 不等 下一个自己又出来了if (index ! 0) //处理最后一个字符不够的问题{inch (8 - index); //最高位必须装上 后边的浪费掉fputc(inch, finCompress);}fclose(finCompress);} 5.写配置文件 string logFile filename;logFile .log;FILE *Log fopen(logFile.c_str(), wb);assert(Log);string chInfo;char str[128] {0}; //没空间 不可以for (size_t i 1; i 256; i){if (_infos[i]._count 0){chInfo _infos[i]._ch;chInfo ,;chInfo _itoa(_infos[i]._count,str,10);chInfo \n;fputs(chInfo.c_str(), Log);chInfo.clear();}}fclose(Log); 6.最后的文件解压 //重构文件void _RestoreFiles(HuffmanTreeNodeFileInfo *root, const char* Fileneme,long long size){assert(root);//原压缩文件string name Fileneme;name .huf;FILE* Out fopen(name.c_str(),rb);assert(Out);string restorefilename Fileneme;restorefilename .over;FILE *over fopen(restorefilename.c_str(),wb);assert(over);int pos 8;long long poss size;unsigned char chz fgetc(Out);while (poss0){HuffmanTreeNodeFileInfo* cur nullptr;cur root;while (cur-_left ! nullptr || cur-_right ! nullptr){pos--;unsigned char temp chz pos;int ch 1 temp;if (ch 0){cur cur-_right;}else if (ch 1){cur cur-_left;}if (pos 0){chz fgetc(Out);pos 8;}}fputc(cur-_weight._ch, over);poss--;}fclose(Out);fclose(over);}void UnCompress(const char* Fileneme)//解压缩{//1.打开日志文件//2.根据信息还原哈夫曼树//3.还原信息string UnCompressneme Fileneme;UnCompressneme .log;FILE *fOutLogFile fopen(UnCompressneme.c_str(), rb);assert(fOutLogFile);string line;while (_ReadLine(fOutLogFile, line)){unsigned char ch line[0];_infos[ch]._count atoi(line.substr(2).c_str());line.clear();} HuffmanTreeFileInfo f;FileInfo invalid;f.CreateTree(_infos, 256, invalid);//根据重建的哈夫曼树 还原文件long long size f.GetRoot()-_weight._count;_RestoreFiles(f.GetRoot(), Fileneme,size);}到此此项目基本完成如遇问题希望留言随时解答如有见解跪求赐教 转载于:https://www.cnblogs.com/li-ning/p/9490022.html
http://www.huolong8.cn/news/120495/

相关文章:

  • 重庆网站模板建站公司爱采购
  • 华泰保险公司官方网站怎么知道网站关键词的搜索来源
  • 彩票网站开发制作软件好看的网站排版
  • 类似千图网的素材网站大德通众包网站建设
  • 电子商务物流网站建设规划方案品牌网站建设市场
  • 响应式网页设计名词解释郑州做网站优化的公
  • 徐州市网站开发建立个机密网站
  • 怎么看网站用的什么后台百度ai智能写作工具
  • 国内建站平台有哪些成都网站建设千古互联
  • 网站建设财务规划wordpress手机中文版下载地址
  • 网站被k怎么办佛山市品牌网站建设价格
  • 网站加速cdnWordpress炫酷特效
  • 小白怎么建设网站海淀网站制作
  • 国外做外汇网站交流建设银行支付宝网站
  • 世界建筑设计网站深圳网站设计公司电话
  • 深圳网站建设_请到中投网络互动网站
  • 设计一个网站多少钱网站建设营销型网站
  • 带后台的网站开发运营成本网站建设与推广协议
  • 查询网站whois进行网站建设
  • 快注销网站宁波公司核名网站
  • 织梦技术个人网站模板住房和城乡建设厅官网证件查询
  • 上海浦东建设集团官方网站做网站 node php
  • vps centos wordpress怎么让客户做网站优化
  • 学校网站建设策划书百度推广优化怎么做
  • 如何做移动支付网站做的不错的h5高端网站
  • wordpress做成论坛系统站长工具seo推广
  • 邹平县建设局网站wordpress主题开发时间
  • 建网站北京ps做ppt模板怎么下载网站
  • 阜蒙县建设学校官网网站三亚做民宿的都用什么网站
  • 关于做网站的创新创业策划书餐饮品牌设计全案