使用哈夫曼编码实现txt文本的压缩(目前只支持英文文本)
这是我第一尝试发帖子,有不足指出希望大家不吝指出和理解。
文本压缩效率
亲自测试,文本压缩效率大概在60%左右,是下载的英文版双城记。大概是198k可以压缩成121k左右的样子,当然压缩效率并不是绝对的,相对于不同内容的文本压缩效率会有所不同。重复性较高的文本压缩效率会更高。
功能
这个代码实现了两个功能:
1)一个是手动输入字符串进行数据分析,然后输出字符串压缩后的二进制编码和字符串内每种类型字符的霍夫曼编码。然后可以输入二进制编码的字符串(手动输入101010这种编码,2或者其他字符会跳出报错),可以进行数据解码。
2)选择文件进行数据的压缩,代码上选择某个文本源文件,然后再选择一个输出的目标文件,将源文件的数据压缩后存储再目标文件中。并将目标文件的数据读取、解压后放在目标文件二中。
代码实现
1)手动输入编码解码
1.获取手动输入的字符串,并分析
2.根据分析后的字符串数据,建立哈夫曼树
3.输出哈夫曼树内的编码信息
4.输出字符串的编码
5.获取哈夫曼树的根节点(后面解码二进制编码用)
6.输入二进制字符串,并解码
7.释放树
GetString(&StringData); //获取输入的字符串BuildHuffmanTree(&StringData,&HuffmanHead); //建立哈夫曼树GetHuffmanCode(StringData,&HuffmanHead);OutPutTreeCode(StringData,HuffmanHead);OutPutStringCode(StringData);GetHufmanRootNode(HuffmanHead);AnalyseTreeCode(RootTreeNode);FreeTreeCode(HuffmanHead.NextNode);
效果
2)获取文件进行压缩
先打开需要的三个文件,一个源文件、目标文件1,目标文件二
1.读取源文件数据,读取出源文件所有字符,分析字符和权值
2.根据字符串信息,建立哈夫曼树
3.获取哈夫曼编码
3.输出每个类型字符的编码
4.获取哈夫曼树的根节点(后面解码二进制编码用)
5.开始数据压缩,将源文件数据压缩到目标文件1内
6.开始解压,将目标文件1中的数据,解压到目标文件2内
OpenFile(fp1,&StringData);BuildHuffmanTree(&StringData,&HuffmanHead); //建立哈夫曼树GetHuffmanCode(StringData,&HuffmanHead);OutPutTreeCode(StringData,HuffmanHead);GetHufmanRootNode(HuffmanHead);StartCompression(fp1,fp2,StringData,&FileBitQueue);StartDecompression(fp2,fp3,RootTreeNode);FreeTreeCode(HuffmanHead.NextNode);
文件编码的效果
遇到的问题和不足
由于压缩后的目标文件1,内的数据不是正常的文本数据,打开是乱码,因此在写入数据到目标文件1和从目标文件1中读取数据都不能使用正常的txt文本读写。
首先打开该文本时,应该使用“wb”方式打开,防止使用“wt”时写入数据和读取数据会出错。
其次源文件不能出现乱码,这个乱码会导致在压缩过程中字符串读取出错。
有兴趣可以参考代码:
链接:https://pan.baidu.com/s/1naEM-HyLp1whdDIW4bavLA
提取码:qj4s
使用哈夫曼编码实现txt文本的压缩(目前只支持英文文本)相关推荐
- 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩
一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 . 解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...
- 基于哈夫曼编码对txt文档实现压缩处理 | 算法分析之贪心算法设计 C语言版
声明:凡代码问题,欢迎在评论区沟通.承蒙指正,一起成长! 目录 一.实验内容与要求 二.概要设计 三.直接上代码 四.运行结果 一.实验内容与要求 内容:哈夫曼编码是广泛地用于数据文件压缩的十分有效的 ...
- c语言用赫夫曼编码压缩文件,用哈夫曼编码C语言实现文件压缩
用哈夫曼编码实现文件压缩,C语言编写,简单实用, if(j%8!=0) /*按八位读取*/ { for(f=j%8;f<8;f++) strcat(header[i].bits,"0& ...
- C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码
David A. Huffman 哈夫曼编码简史(Huffman code) 1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试.导师Robert M. Fano给他们的学期 ...
- C++哈夫曼编码和游程编码实现文件压缩
关于算法介绍:https://blog.csdn.net/fanyun_01/article/details/80211799 源码和可执行文件下载: 链接
- 哈夫曼压缩(一)——英文文本
本文主要介绍如何实现哈夫曼压缩以及提高哈夫曼压缩过程的读写速率,对于哈夫曼树的概念及其构造则没有介绍,感兴趣的朋友可以先百度一下了解相关知识. 一.哈夫曼压缩原理 哈夫曼压缩是一种无损的压缩算法,在压 ...
- 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的实现 ...
- 哈夫曼编码与文件压缩
一:哈夫曼树与哈夫曼编码 大家知道,文件压缩的原理么? 假如我们有一个文件,文件当中仅有 A.B.C.D.E 五种字符,这五种字符出现的频率分别为 5次.4次.3次.2次.1次. 我们知道每个英文字母 ...
- 哈夫曼树、哈夫曼编码与压缩比
1.哈夫曼树 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较 ...
最新文章
- Docker基础技术:Linux Namespace【上】
- linux如何设置浏览器,如何从 命令行 设置默认浏览器?
- 【转】C# WebAPI中为自定义模型设置JSonConverter
- Yuchuan_Linux_C编程之二 GCC编译
- cvpr2020 人脸检测与识别_CVPR 2020 | 元学习人脸识别框架详解
- python环境及pycharm开发环境安装_Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)...
- 网页中使用任意字体之实际操作
- 【转】转贴 poj分类
- php 复选框 未选,php – 在表单发布时如何获取复选框元素中未选中复选框的值?...
- Spring事务管理2----编程式事务管理
- this conn php,测试connect.php文件出现问题
- [转载] 深入理解log机制
- 计算机屏幕分辨率设置,电脑怎么设置屏幕分辨率
- python 分类变量回归_虚拟/分类变量线性回归
- SQL每日一题 牛客17 10月的新客户单价和获客成本
- 【微信小程序/云开发bug解决方案合集】持续更新中(最新22-11-21)
- 运行深度学习出现Fail to create pixmap with Tk_GetPixmap in TkImgPhotoInstanceSetSize
- jar包冲突的解决,依赖树的打印与分析
- Django博客搭建_用户注册1_图片生成
- 三维实景建模及倾斜摄影建模解决方案,附应用案例
热门文章
- ComboTree设置zindex;ComboTree不显示
- shell 数组及其遍历的3种方法
- Vuex,iView UI面包屑导航使用扩展详解
- vue+iviewUI表头添加图标
- 利用org.apache.commons.mail发送邮件smtp.exmail.qq.com:25链接超时
- 百度通用 AI 大突破,智能体通过交互式学习实现举一反三
- 树莓派系统的安装教程
- Excel学习笔记(4)计算统计函数
- SpaceVim 使用指南
- 前三个季度净利增速超60%,海尔智家为何能领跑国内白电三巨头?