[项目]文件压缩
来源:互联网 发布:js时间戳转为date 本地 编辑:程序博客网 时间:2024/05/29 18:11
文件的压缩和解压缩
由于存储一个int 最少需要8个字节 一个char 最少需要1个字节(32位),但大多数时候在一个文件中会有很多重复的数字或者字符,将其进行重新编码,比如说:s:1001 在这个文件中这就代表s 从而就产生了哈夫曼编码
哈夫曼编码: 最佳判定树
定义哈夫曼树之前先说明几个与哈夫曼树有关的概念:
路径: 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
路径长度:路径上的分枝数目称作路径长度。
树的路径长度:从树根到每一个结点的路径长度之和。
结点的带权路径长度:在一棵树中,如果其结点上附带有一个权值,通常把该结点的路径长度与该结点上的权值
之积称为该结点的带权路径长度
树的带权路径长度:如果树中每个叶子上都带有一个权值,则把树中所有叶子的带权路径长度之和称为树的带
权路径长度。
一般来说,用n(n>0)个带权值的叶子来构造二叉树,限定二叉树中除了这n个叶子外只能出现度为2的结点。
那么符合这样条件的二叉树往往可构造出许多颗,
其中带权路径长度最小的二叉树就称为哈夫曼树或最优二叉树
根据哈弗曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点
越远离根结点。
将权小的数据放在叶子节点,每次通过选取出最小的权构造出一个新节点再放入可被选择的区域,最终达到最佳的路线
所以:
(1)利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;
(2)从根结点开始,为到每个叶子结点路径上的左分支赋予0,右分支赋予1,并从根到叶子方向形成该叶子结点的编码
压缩前:
i am a student
压缩后:
a:2
d:1
e:1
i:1
m:1
n:1
s:1
t:2
u:1
然而压缩完以后失去了可读性
故还需将其恢复:解压缩
再将压缩文件恢复成原文件
压缩文件中存储哈夫曼编码(八位一存),解压缩文件通过读哈夫曼编码还原出字符
实现思路:
1.统计文件中字符出现的次数,利用数据结构堆建造Huffman树,出现次数多的编码短,出现次数少的编码长。根据建造好的Huffman树形成编码,以对文件进行压缩。
2.将文件中出现的字符以及他们出现的次数写入配置文件,以便后续的解压缩。
3.根据配置文件读取相关信息重建Huffman树,对压缩后的文件进行译码。
0 0
- 文件压缩项目
- 【数据结构】文件压缩项目
- [项目]文件压缩
- 项目:文件压缩与解压
- 【项目】HuffMan编码--文件压缩
- 项目:文件压缩及解压缩
- 文件压缩(小项目)
- bitmap压缩图片文件的压缩的git项目
- 将所有项目XML文件压缩
- 项目:文件压缩与解压(修复bug)
- 我的第一个项目---文件压缩
- 文件压缩项目的有关问题
- 项目:文件的压缩与解压
- 小项目-文件压缩(哈夫曼树)
- Huffman编码——文件压缩项目
- Huffman树---之文件压缩项目
- 【项目】哈夫曼树的应用:文件压缩
- 文件压缩和解压缩
- Kafka
- 欢迎使用CSDN-markdown编辑器
- 接口测试到底是什么?如何制造接口数据
- SpringMVC+mybatis+maven+Ehcache缓存实现
- HTML5元素拖拽drag与拖放drop相关API
- [项目]文件压缩
- 基于 Vue2.0 的移动端 / PC 端验证码输入组件.
- java(单例模式、抽象类、接口、内部类)
- C++中的解引用与智能指针
- java面试题二
- 防止表单重复递交
- ECMAScript 6入门 学习笔记
- Java synchronized详解
- Oracle 11g Release2 安装图文教程 for windows