赞
踩
最优二叉树又称哈夫曼树,是一种带权路径长最短的树。树的路径长度是从树根到每一个叶子之间的路径长度之和。节点的带树路径长度为从该节点到树根之间的路径长度与该节点权(比如字符在某串中的使用频率)的乘积。
贪心算法(又称贪婪算法)是指,在对 问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部 最优解。
在构建哈夫曼树的过程中,即每次选出两个权值最小的数据,构成左右子树。
有一堆数据0,1,2,3,4该如何构建哈夫曼树呢?
按照贪心算法每次找权值最小(即值最小)的两个数,构成孩子结点,并将这两个数据排除出这一堆数据之外
由于哈弗曼树的数据全在叶子结点,所以把上述权值最小的两个数据构成父结点,然后再将父结点的权值放回上述数据,返回第一步,重复上述过程,直到所有的数据都变成哈夫曼树的叶子结点
1>从构建哈夫曼树的过程我们可以看到每次要选出两个最小的数据,为了提高效率,我们将数据的结点建堆,由于要取权值最小的,所以建小堆,这样能避免因为用数据建堆可能造成重复创建结点
构建堆的代码:
2> 每次取出堆顶的最小的数据之后,将堆中的存放结点删除,重复两次,再将权值相加,创建一个新的结点,并将三个结点链接,将它存放到堆中,在堆中每次删除和增加数据时,记得将堆调整为小堆,直到堆中只剩下一个结点时,哈夫曼树就构建成功了
构建哈夫曼树代码:
在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀(最左子串)。
例:
比如一组编码01,010,001,100,110就不是前缀编码,因为01是010的前缀,如果去掉01和010就是前缀编码了。好比人名张三和张三章就不是前缀编码。
对于一棵具有叶子结点的哈弗曼树,若对树中的每个左支赋予0,右支赋予1(也可以左1右0),则从根到每个叶子结点的通路上,各分支的赋值构成一个二进制串,该二进制串称为哈夫曼编码。
从叶节点往根扫描,若为左子树则标记为0,为右子树则标记为1。如上图6的编码即为:00,5的编码100,等等。
统计字符出现的个数
构建哈夫曼树
生成哈夫曼编码
构建哈夫曼编码的代码:
测试用例:aaaabbbccd
测试结果:
生成的哈弗曼树即为:
主要应用于信息传输和数据压缩等方面。
附:
BTree的插入和查找算法分析(详细图解过程)
http://blog.csdn.net/skyroben/article/details/73755103
红黑树(RBTree)的插入算法以及如何测试一棵树是否是红黑树?(详细图解说明)
http://blog.csdn.net/skyroben/article/details/72837890
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。