天天看点

Huffman文件压缩之文件夹压缩

思路

  应用huffman是带权路径最小二叉树这个性质,完成的文件压缩。我们可以应用这个性质。让一个文件中,每个字符出现的次数作为权值。这样离根节点越近的节点,它的字符出现的次数就越多。然后根据这个节点在父节点左,有效编码为0,在右,有效编码为1,从跟遍历到该节点,得到相应的huffman编码,然后用huffman编码去替代该文件中该字符得而实现压缩。

  其实上面说的是字符,我们不应该单单把它看成一个字符。而是应该把它当成在单个字节中的一个数字。我们实际不是统计每个字符出现的次数,而是统计的是在待压缩文件中,每个字节相应的数字在该文件中出现了多少次。一个字节,总共有256种数字。所以我们要统计一个文件中这256种数字到底出现了多少次,然后拿它们的次数去创建huffman树,得到编码后完成压缩。

  我的文件夹压缩就是基于上面huffman压缩的实现原理。我压缩文件夹时候,先调用了opendir函数,然后再调用了readdir函数,根据深度优先遍历了该文件夹(目录)下的所有文件,然后把所有文件的路径保存到了一个vector中。最后一个一个压缩vector中的文件,从而实现的压缩文件夹。

遍历目录时思路图

Huffman文件压缩之文件夹压缩

压缩思路

通过对文件每一个字节进行次数统计,并建立huffman tree

Huffman文件压缩之文件夹压缩

通过huffman Tree 的编码对文件内容进行压测。为什么可以这样呢? 因为我们观察 Huffman Tree 只有叶子节点才带有真正内容,也就是说Huffman Code 不存在 A 是B的前缀的情况,这也就造成了我们可以通过Huffman Code 进行编码,然后解压的时候,读取每相关编码内容进行解码,因为不存在前缀的情况,我们可以读取一堆 010101的编码,对其一一解码。

现象

Huffman文件压缩之文件夹压缩
Huffman文件压缩之文件夹压缩
Huffman文件压缩之文件夹压缩

代码

https://github.com/sdoyuxuan/Dircompress

继续阅读