[huffman tree] fast_wpl带权路径长度的快速计算

2023-11-20 12:40

本文主要是介绍[huffman tree] fast_wpl带权路径长度的快速计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

wpl: weighted path length,指带权路径长度。

        要解出一组权值对应huffman树的带权路径长度,最直接的做法是先构造出huffman树,然后计算所有叶子结点的带权路径之和,即:

gif.latex?wpl%28T%29%3D%5C%3B%20%5Csum_%7Bk%7D%5CL_%7Bk%7D*w_%7Bk%7D

        这种解法需要我们先构造出huffman树,然后标记每个叶子结点对应的深度,再遍历所有的叶子节点。

        但实际上,如果只需要求解wpl,我们并不需要构造huffman树,更不需要求解深度,遍历叶子节点。只需要反复对原节点及新生成的节点的最小权值进行反复加和即可。

先给出代码:(默认权值数组有序)

//默认权重数组w已经有序(从小到大)
//指针p指向当前最小权值的index,初始值给1
//n为数组w的规模
//权重数组w默认1为起始位
int ans=0;
int fastwpl(int w[],int p,int n)   
{if(n<=1) return 0;        //没有或只有一个节点,wpl为0;if (p>= n) return ans;    //当p指向最末位(根节点),求解结束else {int new_w = w[p] + w[p+1];  //取出两个最小权值,生成新权值ans += new_w;               //插入新权值节点////查找插入位置int i = p+2;        //由于两个最小权值已取出,所以从p+2开始检索while (new_w > w[i] && i<=n ) i++;//在i之前插入新权值for (int j = p + 1; j < i-1; j++) w[j] = w[j + 1];w[i - 1] = new_w;//指针后移一位(每次运算,删除两个最小节点,生成一个新节点,故p+1)p++;fastwpl(w, p, n);}
}

算法说明(以下图huffman树为例):                 

5af8b3a04d434f03917ae7e0bcfa58df.png

最直接的解法为:

                                        gif.latex?wpl%3D2*3&plus;4*3&plus;5*2&plus;7*1%3D35

本文解法为:

                ​​​​​​​        ​​​​​​​        ​​​​​​​        gif.latex?wpl%3D2&plus;4&plus;5&plus;6&plus;7&plus;11%3D35

即将所有非根节点权重进行加和。

        这个解法看似不可理喻,它好像完全没考虑节点的路径长度。实际上,“路径长度”,即叶子深度的计算被蕴含在对中间节点的反复求和过程中。

如:节点2、4的路径长度为3,即其带权路径长为2*3+4*3,相当于对2和4反复相加了3次。

        换种思路,当我们对由 2 + 4 构成的新节点 6 进行相加时,也相当于对进行了一次+2+4运算。

即+2+4+6=+2+4 +(2+4) = + 2 * 2 + 4 * 2。

        同样,下一层运算,对6 + 5 得到的新节点11进行相加,相当于又对 6 = 2 + 4进行了一次加和。

        因此在对新节点进行不断加和的过程,相当于不停在迭代叶子节点2和4的路径长度。

具有普遍性的,我们可以得出结论:

       wpl=生成huffman树的所有非根节点权值之和

        由此,要计算一组权值的最小加权路径长度,我们只需要不停迭代相加叶子节点及其新生成的权值节点即可。在权值数组有序情况下,复杂度为O(n);

        至于排序,我们可以使用快排或归并排序

 

 

 

这篇关于[huffman tree] fast_wpl带权路径长度的快速计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/394670

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R