当前位置: 首页 > article >正文

求Huffman树及其matlab程序详解

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

算法用途

求Haffman树

算法思想

根据定理4.17,给出求Huffman树的算法步骤如下:
①对给出的所要求的叶子顶点的权进行从小到大排序,写出的权重向量 A=(p_{1},p_{2},\dots,p_{n});
②根据定理4.17,写出兄弟的权重分别为 p_{1} 和 p_{2} 以及父亲的权重为 (p_{1}+p_{2}) 的一棵单元树;
③对权重分别为 p_{1}+p_{2},p_{3},\dots,p_{n} 的 (n-1) 个叶权值重新从小到大进行排序,重复②和③,直到只剩下一片叶子;
④算法结束。

程序参数说明

A 表示已知的叶子顶点的权重向量,而叶子顶点的权重就是权重向量的分量。
W 表示所求的 Huffman 树的输出形式,即以Huffman 树所有单元树集合的输出形式。
有关程序运行后所求的Huffman树的输出形式W的说明:
①W的每一行为三个顶点构成的树,且前两列为叶子,最后一列为根,其相应的值代表该节点的权值。
②W中的所有单元树按照从下到上的顺序排列,将这些单元树中权值相同的两个顶点合并为一个顶点(但是任意三个权值相同的顶点不能合并,W中完全相同的行也不能合并),即可得到 Huffman 树。

算法程序详解

%求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

 


http://www.kler.cn/news/312770.html

相关文章:

  • RabbitMQ 常见使用模式详解
  • Delta Lake
  • jetcache-阿里多级缓存框架神器一定要掌握
  • 【Kubernetes知识点】HPA如何控制不同的资源实现自动扩缩容?
  • 青柠视频云——如何开启HTTPS服务?
  • 最新植物大战僵尸杂交版V2.5版本【包含历史版本!持续更新!!】
  • 告别繁琐粘贴,CleanClip Mac 版,让复制粘贴变得简单快捷!粘贴队列功能太强大了!
  • Windows上,使用远程桌面连接Ubuntu
  • Java知识点小结3:内存回收
  • 2024.09.12校招 实习 内推 面经
  • Redis---关闭Redis服务端
  • 操作数组不越界的妙法C++
  • 光伏发电量估算有多重要?如何分析?
  • Java22-匿名变量/模式(Unnamed Variables Patterns)
  • k8s自动清理pod脚本分享
  • Web网站常用测试工具
  • Java【代码 18】处理Word文档里的Excel表格数据(源码分享)
  • 【系统架构设计师-2013年真题】案例分析-答案及详解
  • Leetcode 和为 K 的子数组
  • 【深度学习 Transformer VIT】Transformer VIT:拆解“视觉变形金刚”,笑谈技术细节
  • 【Android源码】屏蔽系统通知出现在系统栏中
  • C++速通LeetCode中等第7题-和为K的子数组(巧用前缀和)
  • 视频服务器:GB28181网络视频协议
  • python使用argparse解析命令行,如何正确传入科学计数法形式的浮点数
  • 力扣100题——杂题
  • Java集合(一)
  • C++ 文件操作
  • 十、数字人IP应用方案
  • chromedriver下载与安装方法
  • react之jsx基础(2)高频使用场景