一、霍夫曼编码基本介绍:
二、通信领域中几种信息的处理方式:
1.定长编码:
原理是将字符对应的ASCLL码转换成二进制后传输信息。
缺点:需要存储大量的二进制数据太浪费时间,空间了。
比如,
空格的ASCLL码值为32,转换成二进制,如图:
2.变长编码:
缺点:匹配的时候,存在多义性。
例如,10110。既可以分解成1,0,110也可以分解成10,110亦可以是101,10.
3.哈夫曼编码:
注意,这个赫夫曼树根据排序方法不同,也可能不太一样,
排序方法的不同是啥意思?比如说有可能会出现权值最小的两个二叉树的权值相加,例如:1+5等于6,而待排数列中还有好几个6,那这个1+5生成的子树该插入到这么多6的什么位置呢?
这样对应的赫夫曼编码也不完全一样,但是WPL是一样的,都是最小的,比如:如果我们让每次生成的新的二又树总是排在权值相同的二叉树的最后一个,则生成的二叉树为:
三、代码
1、思路:
2、分步代码
1)创建Node ,带数据(字符),权值,left 和 right.
class Node implements Comparable<Node> {
Byte data;// 存放数据(字符)本身,比如'a' => 97 ' ' => 32
int weight;// 权值,表示字符出现的次数
Node left;
Node right;
public Node(Byte data, int weight) {
this.data = data;
this.weight = weight;
}
@Override
public int compareTo(Node o) {
// TODO Auto-generated method stub
// 从小到大排序
return this.weight - o.weight;
}
@Override
public String toString() {
return "Node [data=" + data + ", weight=" + weight + "]";
}
// 前序遍历
public void preOrder() {
System.out.println(this);
if (this.left != null) {
this.left.preOrder();
}
if (this.right != null) {
this.right.preOrder();
}
}
}
2)得到"i like like like java do you like a java",对应的 byte[] 数组。
String content = "i like like like java do you like a java";
byte[] contentBytes = content.getBytes();
3)编写一个方法