前段时间因为两个实习的原因将写博客耽搁了下来,现在因为实习事情不多,我就开始继续写了。
其实,看过其他人的博客,书籍以及自身理解后,我认为霍夫曼树可以简化代码的储存,让频率高的字段以更短的字符储存,而频率低的字段用更长的字符储存。最终在多次重复中实现简化压缩。(这个别人讲的很清楚了) 这里我推荐一个小伙伴的博客,他写的很详细。https://blog.csdn.net/qq_44941745/article/details/107370818
创建霍夫曼树,特点就是自下而上的建立,在叶子节点储存字段数据,并从下而上直到建立最后的父节点
而霍夫曼树的建立规则,实际是以出现频率作比较的优先队列的添加与删除规则。并不需要十分刻意去记,只要把代码写出来自然就会知道了。
那么如何对一个字符串创建霍夫曼树呢?
节点的建立如下
public class HTreeNode implements Comparable<HTreeNode>{
public Integer count;
public char chars;
public String code;
HTreeNode parent;
HTreeNode left;
HTreeNode right;
int s = 0;
public HTreeNode(int count, char chars) {
this.count = count;
this.chars = chars;
s = 1;
}
public HTreeNode() {
}
@Override
public int compareTo(HTreeNode h) {
return this.count.compareTo(h.count);
}
}
1 用两个数组,分别保留对应的字符,以及该字符出现的频率
public class Transfer {
int[] count;//频率
char[] chars;//字符
public void transfer(String s) {
int nums = 0;
int times = 0;
char[] chars = {
'a','b','c','d','e','f','g','h','i','j','k','l','m','n'