[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快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav