哈夫曼树的构建、编码以及带权路径长计算

article/2025/10/2 11:26:47

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

构造哈夫曼树的算法如下:
        1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
        2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
        3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
        4)重复2)和3),直到集合F中只有一棵二叉树为止。

假设给定a、b、c、d、e、f的权值分别为{9, 12, 6, 3, 5, 15},构造哈夫曼树的过程如下:

1、为了方便起见,首先将权值进行从小到大排序即,3, 5, 6, 9,12,15

2、选取最小的两个权值3和5构建子树。3+5 = 8作为3,5的父节点(我们规定要满足左子节点小于右子节点)

3、顺序提取6作为左子节点,8作为右子节点。将6+8 = 14作为其父节点。

4、我们发现14大于接下来的9,12。故将9,12作为子节点,9+12 = 21为其父节点构建一个子树。提取元素15,作为右节点上一步构建的14作为左节点,将14+15 = 29作为他们的父节点构建另一个子树。

5、最后将上述两个子树的父节点21,29分别作为左节点和右节点。将21+29 = 50作为他们的父节点。这样就构造出了一个哈夫曼树。

接下来进行带权路径长的计算:

a,b,f(权值9,12,15)三个元素距父节点的距离都为2

c(权值6)元素距父节点的距离为3

d,e(权值3,5)元素距父节点的距离为4

故这棵哈夫曼树的WPL为:WPL =(9 + 12 + 15)*2 + 6 * 3 + (3 + 5)* 4 = 122

 

哈夫曼编码

根据哈夫曼树可以解决报文编码问题。假设需要一个字符串“aaaabbbbccccdddeeeeffffaaaabbbbcceffffabbbbfffffff”进行编码,将它转换为唯一的二进制码,但要求转换出来的二进制编码的长度最小。

该字符串中正好满足a、b、c、d、e、f分别出现9, 12, 6, 3, 5, 15次,作为他们的权值。按照上述方法构建好哈夫曼树。

从哈夫曼树根节点开始,对左子树分配代码“0”,对右子树分配“1”,一直到达叶子节点。然后,将从树根沿着每条路径到达叶子节点的代码排列起来,便得到每个叶子节点的哈夫曼编码,如下右图。

从图中可以看出:

a 的编码为:00

b 的编码为:01

c 的编码为:100

d 的编码为:1010

e 的编码为:1011

f 的编码为:11

 

参考:https://www.cnblogs.com/luankun0214/p/4423648.html?utm_source=tuicool&utm_medium=referral

           https://blog.csdn.net/move_now/article/details/53398753


http://chatgpt.dhexx.cn/article/omYTE42a.shtml

相关文章

哈夫曼树与带权路径长度

问题: 权值分别为从19,21,2,3,6,7,10,32的结点,构造一棵哈夫曼树,该树的带权路径长度是? 哈夫曼树的一个应用: 压缩字符串https://…

哈夫曼树 和 树的带权路径长度

树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。 哈夫曼树构建…

哈夫曼树的带权路径长度的算法

计算方法: ①先对集合中的结点按照权值从小到大排。 ②选两个权值最小的结点,将它们的权值相加构成一个新结点,原来的这两个最小的结点是新结点的左右子结点。 ③在有序集合中将两个被加过的结点去掉,再把新的结点放入集合中排…

哈夫曼树结构和带权路径长度计算

什么是哈夫曼树呢? 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。 它们的带权路径长度分别为: 图a: WPL5*27*22*213*254 图b: WPL5*32*37*213*148 可见,图b的带权路径长…

哈夫曼树结构及带权路径长度

哈夫曼树: 当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。 在构建哈弗曼树时&…

哈弗曼树的带权路径长度

最近刷题刷到了这一题,此题是北邮往年复试题,看了一些网上的讲解,大多数是方法比较复杂,有些巧妙的方法又往往却缺少解释,为了方便大家理解,给小伙伴们梳理梳理 题目描述: 哈夫曼树&#xff0…

哈夫曼树带权路径长度

一. 长什么样? 左边是普通树,右边是哈夫曼树 图a: WPL5*27*22*213*254 图b: WPL5*32*37*213*148 可见,图b的带权路径长度较小,我们可以证明图b就是哈夫曼树(也称为最优二叉树)。 二. 怎么生成和计算&…

哈夫曼树、带权路径长度、前缀编码 的概念

文章目录 一、基本概念1.1带权路径长度(WPL)1.2哈夫曼树 二、哈夫曼树的构造三、哈夫曼树的应用3.1哈夫曼编码与前缀编码 一、基本概念 1.1带权路径长度(WPL) 路径长度: 经历的边数 结点的带权路径长度: …

树学习(2)

1、 一颗哈夫曼树的带权路径长度等于其中所有分支结点的权值之和。(错误) 分析: 树的带权路径长度:定义为树中所有叶结点的带权路径长度之和;(即等于所有结点(叶结点分支结点&#xff0…

哈夫曼树 带权路径

树的带权路径长度 (Weighted Path Length of Tree,简记为WPL) 一般的,我们是可以用常规的构造哈夫曼树求带权路径长度。 计算结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。 带权路径长度WPL&a…

求Huffman树的带权路径长度

Huffman树的建立过程: 首先得到整个叶子结点的集合: 求Huffman树的带权路径长度算法: 书上讲常见的求Huffman树的带权路径长度算法为:从叶子结点权值乘路径长度: WPL7*25*25*23*32*349 另外一种求WPL的算法为&…

运行startx报错的解决

CentOS启动图形界面startx:xauth: file /root/.serverauth.1164 does not exist 运行如下命令 yum update yum groupinstall "X Window System" yum groupinstall "Desktop"报错无法解决问题. 继续运行如下命令 yum grouplist看到了一行: …

linux startx xinit

startx启动过程分析 startx 及xinit 介绍(经典) startx启动过程 startx用法: startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]startx三种启动方式: 1 指定client和server, 例如:startx /usr/bin…

startx 及xinit 介绍(经典)

X-server管理鼠标、键盘、显卡、显示器 X-client处理程序的运行 ---------------------------------------------------------------------------------------------------- WM管理窗口:移动、变型、关闭、装饰...... --------------------------------------------…

startx 及xinit 介绍

X-server管理鼠标、键盘、显卡、显示器X-client处理程序的运行----------------------------------------------------------------------------------------------------WM管理窗口:移动、变型、关闭、装饰......------------------------------------------------…

linux startx无效_startx命令_Linux startx 命令用法详解:用来启动X Window

startx命令用来启动X Window,实际上启动X Window的程序为xinit。 语法startx(参数) 参数客户端及选项:X客户端及选项; 服务器及选项:X服务器及选项。 实例 要在工作站上或 X 终端上启动 X 会话,请输入:star…

ubuntu 启动、退出 startx界面

使用的是ubuntu-focal 20.04 桌面版。因为在熟悉使用ubuntu出现这个问题。 启动startx 1、首先要了解ubuntu几种运行级(参考init_百度百科),ubuntu桌面版默认启动的是init 5 :如下的正常登录界面。 2、进入和从terminal中输入s…

操作系统 - startx/xinit

了解startx/xinit 1.概述 用户可以通过 xinit 程序手动启动 Xorg 显示服务器,startx脚本是 xinit 的前端。 xinit 通常用在启动 X 时执行窗口管理器 或 桌面环境。虽然可以使用 xinit 在无窗口管理器的情况下启动图形程序,大部分图形程序都需要一个兼容…

CentOS 7输入startx无法启动图形化界面

【PS:最终解决方案见最后面】 【问题背景】 前两天在学习linux虚拟化的时候, 发现虚拟机磁盘空间不足, 由于当初分区的时候不是用lvm来分区的, 导致无法扩容, 所以只能新建了一台虚拟机来学习. 然而在新建完成后, 按照之前老师教的一系列优化手段, 将这台手段优化到…

6.1、startx命令怎么不能进入图形界面

命令行界面输入startx命令怎么不能进入图形界面^ ... [复制链接] 发表于 2010-1-29 12:55 | 来自 51CTO网页 [只看他] 楼主 我在虚拟机(vmware)上新安装的red hat linux 9.0在命令行界面输入startx命令怎么不能进入图形界面??&…