Huffman文件压缩之文件夹压缩
思路
应用huffman是带权路径最小二叉树这个性质,完成的文件压缩。我们可以应用这个性质。让一个文件中,每个字符出现的次数作为权值。这样离根节点越近的节点,它的字符出现的次数就越多。然后根据这个节点在父节点左,有效编码为0,在右,有效编码为1,从跟遍历到该节点,得到相应的huffman编码,然后用huffman编码去替代该文件中该字符得而实现压缩。
其实上面说的是字符,我们不应该单单把它看成一个字符。而是应该把它当成在单个字节中的一个数字。我们实际不是统计每个字符出现的次数,而是统计的是在待压缩文件中,每个字节相应的数字在该文件中出现了多少次。一个字节,总共有256种数字。所以我们要统计一个文件中这256种数字到底出现了多少次,然后拿它们的次数去创建huffman树,得到编码后完成压缩。
我的文件夹压缩就是基于上面huffman压缩的实现原理。我压缩文件夹时候,先调用了opendir函数,然后再调用了readdir函数,根据深度优先遍历了该文件夹(目录)下的所有文件,然后把所有文件的路径保存到了一个vector中。最后一个一个压缩vector中的文件,从而实现的压缩文件夹。
遍历目录时思路图
压缩思路
通过对文件每一个字节进行次数统计,并建立huffman tree
通过huffman Tree 的编码对文件内容进行压测。为什么可以这样呢? 因为我们观察 Huffman Tree 只有叶子节点才带有真正内容,也就是说Huffman Code 不存在 A 是B的前缀的情况,这也就造成了我们可以通过Huffman Code 进行编码,然后解压的时候,读取每相关编码内容进行解码,因为不存在前缀的情况,我们可以读取一堆 010101的编码,对其一一解码。
现象
代码
https://github.com/sdoyuxuan/Dircompress
Huffman文件压缩之文件夹压缩相关推荐
- Python压缩目录文件夹,解压目录文件夹及耗时效率统计
Python用zip_file压缩文件夹,用unzip_file解压文件夹 1. 压缩效果对比 发现压缩率挺低的 压缩前:28.9MB,压缩后依然:27.8MB 2. 压缩耗时 运用了Python 装 ...
- java 压缩文件tar_使用Java API进行tar.gz文件及文件夹压缩解压缩
在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputSt ...
- python压缩文件夹下的所有文件_python压缩文件夹内所有文件为zip文件的方法
这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar 简介gz: 即gzip,通常只能压缩一个文件.与tar结合起来就可以实现先打包,再压缩. tar: li ...
- C# 文件/文件夹压缩解压缩
项目上用到的,随手做个记录,哈哈. 直接上代码: 1 using System; 2 using System.Data; 3 using System.Configuration; 4 using ...
- 【Auto.js】[zip压缩] 将文件夹压缩成zip包
将一个文件夹压缩成一个zip包,可应用于项目文件夹打包成zip, 文件夹过滤了目录中的空文件夹,因此,空文件夹不会被打包到zip包中. 由于本人JS知识有限,JAVA也不懂, 导致该函数, 打包大型文 ...
- xp文件夹怎么设置密码?压缩文件及Office文件加密方法
怎么给文件夹设置密码?相信很多朋友都说使用专门的加密软件吧,今天小编教大家不需使用任何软件就可对文件夹进行加密设置,下面一起来看看是如何对文件夹进行加密的吧! 文件夹设置密码方法: 1.进入要进行加密 ...
- java压缩----使用ANT JDK压缩---只压缩选中目录的指定文件夹
写在前面的话:使用ANT中的压缩功能在很多文章中都有,但是只能压缩指定目录的全部文件或者文件夹,在项目中,经常有这样的需求:只压缩指定目录的部分文件夹, 用过ant.xml 的人都很容易想到 file ...
- Java实现将文件或者文件夹压缩成zip
Java实现将文件或者文件夹压缩成zip 最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类.但找了好多篇博客,总是发现有bug.因此就自己来写了个工具类. 这个工具类的功 ...
- java 压缩文件夹_java 实现压缩文件(单文件 或 文件夹)
接着上篇了解一下java压缩实现过程,下面的是支持 单文件 或 文件夹 压缩的实现,使用递归. 效果: 代码: package com.gx.compress; import java.io.Buff ...
最新文章
- 神经网络的学习方式网络传播和图卷积,两者到底什么关系?
- 安全攻防技能——Web安全——SQL注入
- 赞!史上最全的互联网思维精髓总结
- mybatis 忽略实体字段_27道mybatis面试真题,你能答对几道?
- 华为徐直军:华为云成为智能世界五朵云之一,2021年大力支持伙伴持续创新
- Python-cvxopt库的使用(2)(解决QP问题)
- Mac 下iterm2配色方案(高亮)及显示分支
- 显式Intent 和隐式 Intent 的区别
- 《利用Python进行数据分析·第2版》第13章 Python建模库介绍
- 防御XSS攻击的七条原则
- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platf...
- matlab激活中遇到 matlab2017a license error -8,523错误
- java星座出生日期_Java根据出生日期计算星座
- 网络错误0x80070005,访问被拒绝[亲测解决]
- 隔行插入行、隔行标示颜色,#E灵 #Excel插件
- OSChina 周六乱弹 —— 生命诚可贵,啤酒价更高
- 杰理之Dongle【篇】
- 用php和mysql写一个注册登录页面
- 浅谈因子分析(Factor Analysis)
- 大数据中数据挖掘技术的挑战