手记

手撕哈夫曼算法

Huffman 树,又称最优树,是一类带权路径长度最短的树,有着广泛的应用。
用处就是在编码的时候,可以缩小空间,提高利用率,本篇就是尝试自己完成Huffman编码。算法的实现步骤很简单:
(1)创建二叉树列表A,左右子树均为空
(2)选择列表A中权值最小的两个,组成新的二叉树,该树的权值为最小的两个之和
(3)在A中删除这两个树,将新的树加入列表A
(4)重复(2)和(3),直到F只含一棵树为止

实现代码如下:
该函数传递的List是已经从小到大排序好的了

package cn.caeser.demo.huffman;

import java.util.List;

public class HuffmanConversion {
	public static List<Tree> target;
	
	public static void convert(List<Tree> treeList){
		target=treeList;
		while(target.size()>=2) {
			Tree former=target.get(0);
			Tree later=target.get(1);
			Tree treeItem=new Tree();
			treeItem.setLeftTree(former);
			treeItem.setRightTree(later);
			treeItem.setPriorityValue(former.getPriorityValue()+later.getPriorityValue());
			target.remove(0);
			target.remove(0);
			int i=0;
			for (i=0; i < target.size(); i++) {
				if(treeItem.getPriorityValue()<target.get(i).getPriorityValue()) {
					target.add(i, treeItem);
					i=-1;
					break;
				}
			}
			if(i==target.size()) {
				//如果循环结束时都没有执行add操作
				//表示当前treeItem的priorityValue是最大的
				target.add(treeItem);
			}
			if(target.size()==0) {
				//树列表为空时表示已经生成最后一个树
				target.add(treeItem);
				break;
			}
		}
	}
}

面试的时候总会有各种算法题,如何快速的实现算法,是自己需要仔细考虑的,死记硬背不是很好的选择,加上自己的理解,说不定给自己的面试情况加上好几分。

0人推荐
随时随地看视频
慕课网APP

相关阅读

手撕哈夫曼算法