思路

  应用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文件压缩之文件夹压缩相关推荐

  1. Python压缩目录文件夹,解压目录文件夹及耗时效率统计

    Python用zip_file压缩文件夹,用unzip_file解压文件夹 1. 压缩效果对比 发现压缩率挺低的 压缩前:28.9MB,压缩后依然:27.8MB 2. 压缩耗时 运用了Python 装 ...

  2. java 压缩文件tar_使用Java API进行tar.gz文件及文件夹压缩解压缩

    在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputSt ...

  3. python压缩文件夹下的所有文件_python压缩文件夹内所有文件为zip文件的方法

    这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar 简介gz: 即gzip,通常只能压缩一个文件.与tar结合起来就可以实现先打包,再压缩. tar: li ...

  4. C# 文件/文件夹压缩解压缩

    项目上用到的,随手做个记录,哈哈. 直接上代码: 1 using System; 2 using System.Data; 3 using System.Configuration; 4 using ...

  5. 【Auto.js】[zip压缩] 将文件夹压缩成zip包

    将一个文件夹压缩成一个zip包,可应用于项目文件夹打包成zip, 文件夹过滤了目录中的空文件夹,因此,空文件夹不会被打包到zip包中. 由于本人JS知识有限,JAVA也不懂, 导致该函数, 打包大型文 ...

  6. xp文件夹怎么设置密码?压缩文件及Office文件加密方法

    怎么给文件夹设置密码?相信很多朋友都说使用专门的加密软件吧,今天小编教大家不需使用任何软件就可对文件夹进行加密设置,下面一起来看看是如何对文件夹进行加密的吧! 文件夹设置密码方法: 1.进入要进行加密 ...

  7. java压缩----使用ANT JDK压缩---只压缩选中目录的指定文件夹

    写在前面的话:使用ANT中的压缩功能在很多文章中都有,但是只能压缩指定目录的全部文件或者文件夹,在项目中,经常有这样的需求:只压缩指定目录的部分文件夹, 用过ant.xml 的人都很容易想到 file ...

  8. Java实现将文件或者文件夹压缩成zip

    Java实现将文件或者文件夹压缩成zip 最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类.但找了好多篇博客,总是发现有bug.因此就自己来写了个工具类. 这个工具类的功 ...

  9. java 压缩文件夹_java 实现压缩文件(单文件 或 文件夹)

    接着上篇了解一下java压缩实现过程,下面的是支持 单文件 或 文件夹 压缩的实现,使用递归. 效果: 代码: package com.gx.compress; import java.io.Buff ...

最新文章

  1. 神经网络的学习方式网络传播和图卷积,两者到底什么关系?
  2. 安全攻防技能——Web安全——SQL注入
  3. 赞!史上最全的互联网思维精髓总结
  4. mybatis 忽略实体字段_27道mybatis面试真题,你能答对几道?
  5. 华为徐直军:华为云成为智能世界五朵云之一,2021年大力支持伙伴持续创新
  6. Python-cvxopt库的使用(2)(解决QP问题)
  7. Mac 下iterm2配色方案(高亮)及显示分支
  8. 显式Intent 和隐式 Intent 的区别
  9. 《利用Python进行数据分析·第2版》第13章 Python建模库介绍
  10. 防御XSS攻击的七条原则
  11. [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platf...
  12. matlab激活中遇到 matlab2017a license error -8,523错误
  13. java星座出生日期_Java根据出生日期计算星座
  14. 网络错误0x80070005,访问被拒绝[亲测解决]
  15. 隔行插入行、隔行标示颜色,#E灵 #Excel插件
  16. OSChina 周六乱弹 —— 生命诚可贵,啤酒价更高
  17. 杰理之Dongle【篇】
  18. 用php和mysql写一个注册登录页面
  19. 浅谈因子分析(Factor Analysis)
  20. 大数据中数据挖掘技术的挑战

热门文章

  1. 三页搞定GB2818/SIP/RTP、PS封装
  2. OpenTracing 详解
  3. U盘html文件恢复不了,u盘文件突然不见了怎么恢复?恢复小技巧来了
  4. YOLOv2原文解读
  5. 腾讯地图获取所选区域坐标
  6. python 病毒 基因_#Python#提取基因对应的蛋白质名
  7. 学编程要学好英语吗?
  8. 【面试】 CVTE 视源股份 C++ 软件开发 二面
  9. oracle 常见报错
  10. cbrt c语音_如何在C语言中实现功能重载?