求哈夫曼编码

这篇博客详细介绍了哈夫曼树的概念,即最优二叉树,它保证了叶子节点到根节点的路径乘权和最小。作者分享了如何使用Java实现哈夫曼树的构造过程,并强调了在构建过程中保持权值排序的重要性。通过从叶子节点向上,以左为0、右为1的方式,可以得到哈夫曼编码。

    时隔两年总算把哈夫曼的编码搞清楚了,哈夫曼树也称为最优二叉树,他就是个二叉树,只不过是带权的且每个叶子结点上的权重与该结点到树根上之间的路径长度之积最小, 假如有n个权值{w1,w2,...,wn} ,n个叶子结点上的权为wi,结点到树根的路径为li则这个树的带权路径长度

   WPL=w1l1+w2l2+..+wili

   我用JAVA实现

      根据一般性规律,当有n个叶子时总结点树数为2*n-1个,构造方法基本思想:1.刚开始构造N个有权值得只有根结点的二叉树+剩下的无权值得只有根结点的二叉树  2.选取两个根结点权值最小的两个作为左右子树放在那些剩下的非叶子的无权值得二叉树下,这时这棵新的二叉树的权值为其左右子树的权值之和3.重复2的操作最后就可以等到一颗拥有所以叶子的哈夫曼树。具体代码如下:

   Huffman.java

import java.util.Arrays;

/**
 * Created by Administrator on 2016/11/5.
 */
public class Huffman {
    /**
     * 数组统一从1开始
     *
     * @param w 权重的数组
     * @param n 叶子的个数
     * @return 哈夫曼二叉树
     */
    public Node[] huffmanTree(int[] w, int n) {
        if (n <= 1) {
            return null;
        }
        int m = 2 * n - 1;
        Node[] nodes = new Node[m + 1];//需要的所有结点 0号单元不用
        for(int i=1;i<=m;i++){
            nodes[i]=new Node();
        }
        for (int i = 1; i <= n; i++) {
            nodes[i].weight =w[i];
            nodes[i].index=i;
        }
        for(int i=n+1;i<=m;++i){
            nodes[i].index=i;
        }
        /*****建立哈夫曼树*******/
        f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值