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

树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。
结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。

哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。

 

哈夫曼树构建教程 https://blog.csdn.net/xueba8/article/details/78477892

例:对于给定的一组权值w={1,4,9,16,25,36,49,64,81,100},构造具有最小带权外部路径长度的扩充二叉树,并求出他的的带权外部路径长度。

解:1、首先我们对这一组数字进行排序。规则是从小到大排列(题目已排序好)。

      2、在这些数中 选择两个最小的数字(哈夫曼树是从下往上排列的)写在纸上。如下图所示

      3、用一个类似于树杈的“树枝”连接上两个最小的数。在顶点处计算出这两个数字的和 并写在上面。然后再比较剩下的数字和这个和的大小,再取出两个最小的数字进行排列

 

      4、如上图中30,25的和为55,已经大于36,49.所以这个时候开始有分支,用36,49再构造一个分支,如下图。

 

    5、最后将分支合并成一个二叉树,如下图

6、这样,二叉树结构就构建好了。

带权外部路径长度计算;

WPL=2*100 + 3*64 + 2*81 + 4*25 + 2*49 + 2*36 + 5*16 + 6*9 + 7*1 + 7*4 =993

(385的权重为0,216和166权重为1.....)

### 哈夫曼路径长度 #### 定义 哈夫曼是一种特殊的二叉,其特点是具有最小的路径长度(Weighted Path Length, WPL)。对于给定的一组叶子节点及其重,构建出使得这些叶子节点到根节点的加距离总最小化的二叉即为哈夫曼[^2]。 #### 计算方法 为了计算一棵哈夫曼路径长度,需遵循如下原则: - **叶子节点的路径长度**是指该叶子节点所代表的数据项的重要性度量与其从根到达此叶位置之间边的数量乘积的结果。具体来说,等于叶子节点自身的重值乘以其所在层数减去一层后的数值[^3]。 - **整棵路径长度(WPL)**则是所有叶子节点各自路径长度所得结果。这意味着只需关注原始输入中的各个独立重,并将其分别同对应于最终形成的哈夫曼内相应深度相联系即可完成整个WPL的评估工作[^4]。 #### 构建与计算实例 假设存在一组频率分别为`{5, 7, 2, 13}`的数据集来创建对应的哈夫曼并计算其WPL: ```python from heapq import heappush, heappop def huffman_tree(weights): heap = [[weight, [symbol, ""]] for symbol, weight in enumerate(weights)] while len(heap) > 1: lo = heappop(heap) hi = heappop(heap) for pair in lo[1:]: pair[1] = '0' + pair[1] for pair in hi[1:]: pair[1] = '1' + pair[1] heappush(heap, [lo[0]+hi[0]] + lo[1:] + hi[1:]) return sorted(heappop(heap)[1:], key=lambda p: (len(p[-1]), p)) weights = [5, 7, 2, 13] huff = huffman_tree([(i, w) for i, w in zip(range(len(weights)), weights)]) for item in huff: print(f"Symbol {item[0]} with code {item[1]}") # 输出各符号编码后可进一步用于计算实际应用环境下的压缩效率等指标 ``` 通过上述Python代码片段可以直观展示如何基于指定重集合建立哈夫曼的过程以及获取每片叶子上附着的具体编码方案;进而依据前述定义轻松得出整体结构关于路径长度的信息。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值