文件压缩项目(基于Huffman编码)

news2024/11/25 15:24:22

目录

  • 文件压缩
  • 压缩本质
  • huffman树
  • huffman树的构建
  • Huffman编码的压缩过程
    • 获取Huffman编码
    • 构建压缩信息
  • Huffman编码的解压缩过程
    • 解压压缩的数据
  • 写压缩函数的注意事项
    • 文件指针移动到头
  • 测试过程
    • 对文本文件进行压缩
      • 纯英文文本测试
      • 中文文本测试
      • 中英文文本测试
    • 对图片进行压缩解压缩

文件压缩

文件压缩可以简单理解为在不丢失有用信息的前提下,缩减数据量已达到压缩的效果。

压缩本质

1.专有名词采用的固定短语

比如:我们常把清华大学北京大学称为清北,这样的就是专有名词压缩。

2.缩短文件中重复的短语,即将重复的内容替换成更短的<距离,长度>对。

举个栗子:kiloluoshuabcxyzkiloxiaohengkiloluoshuabcdefg
替换后为kiloluoshuxyz<16,4>xiaoheng<28,10>abcdefg

3.给文件中每个字节找一个更短的编码,这种方式就是huffman编码的压缩原理

比如文件中存放的数据为: ABCDBBCCDDCCDDDD
我们可以采用对每个字符都替换成编码来表示
采用动态不等长编码表示即按出现次数,出现频率低的用更长的编码表示,出现频率高的用短的编码表示
在这里插入图片描述
由此可以得到:
采用静态等长编码的压缩:00011011 01011010 11111010 11111111
采用动态不等长压缩: 100101110 10110111 11001111 0000

huffman树

从二叉树的根节点到二叉树所有叶节点的路径长度与相应权值的乘积之和为该二叉树的带权路径长度,带权路径最小的二叉树为Huffman树。

在这里插入图片描述
这棵树的带权路径为:13+33+52+71 = 29

huffman树的构建

1.将给定的N个权值W ={W1,W2…}构造N棵只有根节点的二叉树森林F = {T1,T2…}(我们这将统计次数放入节点中),每棵二叉树只有一个带权值W的根节点,无左右子树。
2.循环操作,直到只剩下一棵二叉树
a.在F中选取两棵根节点权值最小的二叉树作为左右子树构造一棵新的二叉树,新的根节点权值为其左右子树权值之和。
b.在F中删除这两棵二叉树
c.把二叉树加入到F中
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

Huffman编码的压缩过程

1.统计源文件中每个节点出现的次数
2.采用字节频次来获取Huffman编码
3.获取每个字节的Huffman编码
4.构建编码信息
5.用得到的编码对源文件中的每个字节进行改写

获取Huffman编码

在这里插入图片描述

有没有一种情况是如果不等长编码中出现一个编码是另一个编码的前缀呢?
这种情况是不可能出现的,因为在构建huffman树的时候出现次数只能是叶节点的位置。

构建压缩信息

因为我们创建压缩文件也要想办法把它恢复,所以节点中不仅要存放压缩后的数据还要保存对应的信息。
在这里插入图片描述

Huffman编码的解压缩过程

1.从压缩文件中获取源文件的后缀
2.从压缩文件中获取字符次数的总行数
3.获取每个字符出现的次数
4.重构huffman树
5.解压压缩的数据

解压压缩的数据

1.从压缩文件中读取一个字节的压缩数据ch
2.从根节点开始,按照8个比特位从高到低遍历huffman树,循环操作

在这里插入图片描述

写压缩函数的注意事项

文件指针移动到头

我在读取文件操作中读取了两次,文件指针在读取一次之后到了文件尾导致第二次读取不到数据,所以这里还要对文件指针进行处理。在第二次读取文件之前采用fseek(fIn, 0, SEEK_SET)将指针移到文件起始位置。

测试过程

对文本文件进行压缩

做完项目还要对项目进行测试,下面是我做的几个测试,来看看压缩解压有没有什么问题以及压缩率。

纯英文文本测试

我导入了一篇纯英文文档,可以看到huffman的压缩率在我这个测试中可以达到57%,当然中依靠huffman编码的压缩是达不到最好的效果的,还是需要再运用别的压缩算法来完善这个项目。
在这里插入图片描述

中文文本测试

我导入了一篇纯中文文档,可以看到Huffman压缩对文件大小也是有所减少的。
在这里插入图片描述

中英文文本测试

在这里插入图片描述

对图片进行压缩解压缩

对图片文件进行压缩来看看是否能还原
在这里插入图片描述
在这里插入图片描述

图片压缩的效果不明显但是能压缩和还原说明能支持不同格式文件的压缩。

项目代码上传置Gitee,源码链接:https://gitee.com/kilokeycode/CSDN-code/commit/2230452505e2c7c3be3f95e1227000994494a053

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129044.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第 1 课 编程是一门技术 ——认识Dev-C++

1.什么是编程&#xff1f; 软件由程序和文档组成&#xff0c;每个程序都是由一条条计算机能够识别和执行的指令组成的&#xff0c;每一天指令指挥计算机完成指定的操作。编写程序又称编程&#xff0c;他是一门技术。通俗地讲&#xff0c;编程就是告诉计算机&#xff0c;你要帮我…

合成控制法SCM

研究D的处理效应&#xff0c;找一个相似的样本&#xff0c;他们的差异就是处理效应。但&#xff1a;难点就在如何找到相似的样本。那么就通过合成法来合成一个虚拟的重庆。 案例&#xff1a;美国加州香烟法案出台 依靠权重来合成一个新的y 假设我们不用SCM&#xff0c;直接靠着…

文心快码前端工程师观点分享:人机协同关系总结与展望

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站1…

CloudberryDB 内核分享:Directory Table 底层逻辑与实现原理讲解

在之前的直播中&#xff0c;我们向大家介绍了&#x1f517;&#xff0c;为企业AI应用创新提供更高质量的非结构化数据语料输入和知识库支持&#xff0c;感兴趣的朋友可以点击链接阅读。 随着我们的开源数据仓库产品Cloudberry Database&#xff08;简称“CloudberryDB”&#…

杂七杂八-系统环境安装

杂七杂八-系统&环境安装 1. 系统安装2.环境安装 仅个人笔记使用&#xff0c;感谢点赞关注 1. 系统安装 Windows安装linux子系统WSL2&#xff1a;使用windows系统跑linux程序(大模型) 2.环境安装 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注…

基于spring的博客系统(总)

通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使⽤, 并完成了图书管理系统的常规功能 开发, 接下来我们系统的从0到1完成⼀个项⽬的开发&#xff1b; 1. 项⽬介绍 使⽤SSM框架实现⼀个简单的博客系统 共5个⻚⾯ 1. 用户登录 2. 博客发表⻚ 3. 博客编辑⻚ 4. 博客…

零工市场小程序是灵活就业的新趋势?

人力资源社会保障部曾发文《人力资源社会保障部 民政部 财政部 住房和城乡建设部 国家市场监管总局关于加强零工市场建设 完善求职招聘服务的意见》。 找零工在传统情况下会有比较多的困难&#xff0c;比如能能够掌握的信息较少、不知道工作单位是否靠谱等等的问题&#xff0c…

心觉:如何打破用脑学习的瓶颈?教你用心学习,实现真正蜕变!

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作167/1000天 我们经常听到父母对孩子说要“用心学习&#xff0c;用心学习” 大概意思是告诉孩子学习的时候要专注&#xff0c;要认真…

【9月持续更新】国内ChatGPT-4中文镜像网站大全

一、国内大模型与ChatGPT的区别 &#x1f9e0; 国内大模型&#xff1a;专注于国内市场&#xff0c;支持本土企业及用户&#xff0c;适用于中文语境下的客服、教育、内容生成等应用场景。ChatGPT&#xff1a;全球适用性强&#xff0c;但在中文环境下的本地化程度不如国内大模型…

Arm GIC-v3中断原理及验证(通过kvm-unit-tests)

一、参考连接 gic-v3相关原理可参考https://zhuanlan.zhihu.com/p/520133301 本文主要通过开源测试工具kvm-unit-tests&#xff0c;针对GIC的中断进行一系列验证&#xff0c;这样可以直入中断底层&#xff0c;熟悉整个原理。 kvm-unit-tests官网为kvm-unit-tests / KVM-Unit…

『 Linux 』协议的定制

文章目录 协议的概念序列化和反序列化网络计算器套接字接口的封装服务端大致框架协议的定制Request的序列化与反序列化Response的序列化与反序列化报头的封装的解包网络服务服务端的封装已提取报文的移除客户端的封装客户端的调用服务端接收多个请求 JSON 自动序列化反序列化使…

QT打开摄像头采集

QT打开摄像头采集 今天好不容易把opencv的环境装好&#xff0c;然后想学习一下人脸识别的功能&#xff0c;但是在图书馆坐了4个多小时了&#xff0c;屁股疼就先写个摄像头采集的功能&#xff0c;明天继续学习吧&#xff0c;废话不多&#xff0c;嚼个奶片开始发车&#xff01;&…

3.安卓逆向-java语言控制流和数据类型

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;2.安卓逆向-初识java语言 上一个内容里写了编写java语言代码的环境搭建&#xff0c;也就是下载…

你的个人生成式AI创新课程

我曾经写过许多博客文章&#xff0c;讨论如何使用生成式AI&#xff08;GenAI&#xff09;工具&#xff0c;例如OpenAI ChatGPT、微软Copilot和Google Gemini来提升专业效率和个人发展。然而&#xff0c;我们必须从仅仅使用这些GenAI工具来提高生产力的思维模式&#xff0c;转变…

echarts 关系图 legend 图例不显示问题

关系图希望显示图例&#xff0c;如下效果&#xff1a; 按照常规echarts图表的配置&#xff0c;配置完legend&#xff0c;图例居然不显示。 legend: {show: true,icon: circle,left: left }经过一番查找和思考&#xff0c;原来是因为series配置中没有设置categories项&#xf…

通信工程学习:什么是SLF签约数据定位功能

SLF&#xff1a;签约数据定位功能 SLF&#xff08;Subscription Locator Function&#xff09;即签约数据定位功能&#xff0c;是IMS&#xff08;IP Multimedia Subsystem&#xff09;IP多媒体子系统体系结构中的一个关键组成部分。其主要功能是在网络运营商部署了多个独立可寻…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

尚硅谷的尚乐代驾项目

项目源码 乐尚代驾项目: 重做乐尚代驾项目 (gitee.com) 一 项目介绍 1 介绍 【**乐尚代驾**】代驾是一种新型的出行服务模式&#xff0c;主营业务&#xff1a;酒后代驾、商务代驾、长途代驾&#xff0c;其主要特点是通过线上平台为用户提供代驾服务&#xff0c;伴随中国家…

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、…

Navicat备份数据库

Navicat备份数据库 &#x1f4d4; 千寻简笔记介绍 千寻简文库已开源&#xff0c;Gitee与GitHub搜索chihiro-doc&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;文库采用精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请帮我点一…