求Huffman树及其MATLAB实现

Huffman树的定义

给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。(来自百度百科)

算法思想

1.对给出的所有叶子节点的权重进行从小到大的排序,得到权重向量W = (p1, p2, p3…pn)。
2.写出子节点为p1,p2父节点为p1+p2的单元树
3.对p1+p2及p3,p4…pn从小到大排序,再重复2,3,直到只剩一片叶子

程序的参数说明

1.A为叶子节点的权重向量
2.W为输出的Huffman树

MATLAB实现

function W = Huftref(A)
k = 1;
Y = sort(A);
n = length(A);
B = Y(1) + Y(2);
W = [Y(1) Y(2) B];
Y1 = Y;
m = 0;
while m == 0
    k = k + 1;
    B1 = [B Y1(3 : length(Y1))];
    f = length(B1);
    if f >= 2
        Y1 = sort(B1);
        B = Y1(1) + Y1(2);
        W(k,:) = [Y1(1) Y1(2) B];
    else
        m = 1;
    end
end

测试

1.测试用例:A =

 2     4     5     6     8     9

2.测试结果:W =

 2     4     6
 5     6    11
 6     8    14
 9    11    20
14    20    34
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值