哈夫曼压缩总结

由于最近笔者比较忙,所以总结做的比较粗糙,请谅解
1.链表
链表作为哈夫曼压缩的基础,所以由链表说起(双向)
链表的几个要素:
1.链表的节点:由节点元素(节点的储存值),
2.链表节点的联系:此处由人为的定义,由此演化出单向,双向,环链表
3.特别说明的是链表的循环遍历必须用到递归
public class Node {
public Object obj;//节点的数据对象
public Node next;//下一个节点对象
public Node front;//上一个节点对象
public Node(Object obj){
this.obj=obj;

}
}
2.二叉树
有了前面的链表做为基础,二叉树由此而衍生,
所谓的二叉树,就是指有一个根节点,其他的所有的节点都有一个父节点,一个平级
的节点,如若不是叶子节点,则还有二个子节点,
3.哈夫曼树
哈夫曼树就是按照一定的规则(程序员自己定义)所构造出的二叉树,
规则: 1.以一个队列来做为其中的节点,其中的队列是有序排列的(从小到大)
2. 每取出2个队列里的元素做为节点,就要把2个元素之和做为第三个元素,
3.权值:必须取到最小的权值,既最小的要放到最后的页节点,最大的要做为根
4.由于为压缩做垫底,所以节点构造改变,
public class TreeNode {

int num;//当前字节的次数
int byteint;//当前元素的无符号字节
String flag="";//表示的左或者右结点 "0"表示左 "1"表示右
TreeNode parent;// 父节点
TreeNode left;
TreeNode right;

public TreeNode(int obj) {
this.num = obj;
}

}
5.其中用到一个新的知识:
构造最优队列:
public PriorityQueue<TreeNode> array2List(int[] array) {
// 根据指定的比较器创建一个优先队列
PriorityQueue<TreeNode> list = new PriorityQueue<TreeNode>(11,
new MyComparator());
// 将数组中的每一个元素都作为一个结点
for (int i = 0; i < array.length; i++) {
if(array[i]!=0){
// 创建结点对象
TreeNode node = new TreeNode(array[i]);
node.byteint = i;// 次数对应的字节
// 将结点放入队列
list.add(node);
}
}
return list;
}
4.哈夫曼的压缩步骤以及原理
当按照上述步骤建造一个哈夫曼树以后,就可以正式进入我们的文件操作步骤了,首先我们得从文件读取字节,并且建造一个大小为256的int型数组,对我们所读入的字节进行统计,数组下标既表示字节,里面的元素表示字节在文件中出现的次数,
再依据这个数组构造一个哈夫曼树,并可以得到一个码表,此时只需要将码表和页节点的哈夫曼数字存入即可,解压则是反过来即可;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值