求Huffman树及其matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记#################

算法用途

求Haffman树

算法思想

根据定理4.17,给出求Huffman树的算法步骤如下:

①对给出的所要求的叶子顶点的权进行从小到大排序,写出的权重向量 ;

②根据定理4.17,写出兄弟的权重分别为 以及父亲的权重为 (+) 的一棵单元树;

③对权重分别为 个叶权值重新从小到大进行排序,重复②和③,直到只剩下一片叶子;

④算法结束。

程序参数说明

A 表示已知的叶子顶点的权重向量,而叶子顶点的权重就是权重向量的分量。
W 表示所求的 Huffman 树的输出形式,即以Huffman 树所有单元树集合的输出形式。

有关程序运行后所求的Huffman树的输出形式W的说明:

①W的每一行为三个顶点构成的树,且前两列为叶子,最后一列为根,其相应的值代表该节点的权值。

②W中的所有单元树按照从下到上的顺序排列,将这些单元树中权值相同的两个顶点合并为一个顶点(但是任意三个权值相同的顶点不能合并,W中完全相同的行也不能合并),即可得到 Huffman 树。

算法程序详解

Matlab 复制代码
%求Huffman树
function [ W ] = huftref( A )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% 输入: A: 已知叶子顶点的权重向量
%%% 输出: W: 所求的Huffman树的输出,从下到上顺序排列,前两列为叶子,最后一列为根
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

k = 1;
Y = sort(A);        % 将 A 升序排列
n = length(A);      % 计算顶点数
B = Y(1) + Y(2);    % B 为父亲权重
W = [Y(1) Y(2) B];  % 兄弟权重为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,Y(3),...,Y(n) 排序
        B = Y1(1) + Y1(2);      % 重复步骤(1)(2)
        W(k,:) = [Y1(1) Y1(2) B];   % 将新的单元数写入 Huffman 树中
    else
        m = 1;
    end
end
相关推荐
知来者逆14 分钟前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊19 分钟前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北19 分钟前
力扣-160.相交链表
算法·leetcode·链表
爱研究的小陈1 小时前
Day 3:数学基础回顾——线性代数与概率论在AI中的核心作用
算法
渭雨轻尘_学习计算机ing1 小时前
二叉树的最大宽度计算
算法·面试
BB_CC_DD2 小时前
四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)
深度学习·算法·聚类
梁下轻语的秋缘3 小时前
每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
c++·算法·蓝桥杯
CODE_RabbitV3 小时前
【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)
算法
mit6.8244 小时前
[贪心_7] 最优除法 | 跳跃游戏 II | 加油站
数据结构·算法·leetcode
keep intensify4 小时前
通讯录完善版本(详细讲解+源码)
c语言·开发语言·数据结构·算法