求Huffman树的带权路径长度

news2024/11/26 0:53:10

Huffman树的建立过程:

首先得到整个叶子结点的集合:

 求Huffman树的带权路径长度算法:

书上讲常见的求Huffman树的带权路径长度算法为:从叶子结点权值乘路径长度:

WPL=7*2+5*2+5*2+3*3+2*3=49

另外一种求WPL的算法为:非叶子几点权值之和:

WPL=22+12+10+5=49

这种方法并不是毫无道理,应为同一个结点下的两个叶子结点的路径长度是一样的,叶子结点的路径长度完全可以反映到其双亲结点上去。

这种算法较为简单,直接可以忽略建树的步骤,直接求出WPL(当然要明白如何求WPL)

算法的主要思想:

1.首先将得到的元素集合进行排序;(降序。升序也行,请自己尝试)

2.数组末尾两个元素求和(俩结点的双亲结点权值),将其结果放在数组倒数第二个位置上并且数组长度减1

3.累加每次求和结果。(即就是非叶子结点的权值)

注意:当集合元素过小时不适用本算法,需要特殊处理,不然会发生数组越界。

C语言实现:

#include<stdio.h>
#include<malloc.h>
// 算法思想:
// 本题主要为求哈夫曼树的带权路径长度,故未将重点放在建树上
// Huffman树的带权路径长其实就是其非叶子结点的权值和

//排序算法
void sort(int *data,int n){
    int i,j;
    for(i =0;i<n;++i){
        for (j = 0;  j< n-i; ++j) {
            if(data[j]<data[j+1]){
                int t = data[j+1];
                data[j+1] = data[j];
                data[j] = t;
            }
        }
    }
}

int main() {
    int n, *data,i,sum =0,x;
    scanf("%d", &n);
    //动态开辟数组
    data = (int *) malloc(sizeof(int)*n);
    for(i =0;i<n;++i)
        scanf("%d",&data[i]);
    if(n<=2){   //当集合过小时,不适用本算法,特殊处理
        for(i =0;i<n;++i)
            sum += data[i];
        printf("%d",data[0]+data[1]);
        return 0;
    }
    while(1){
        sort(data,n);   //先对数组排序(降序)
        x=data[n-1]+data[n-2];  //将末尾两元素求和(上层结点权值)
        data[n-2] = x;  //消除原来两元素,增加新元素
        sum+=x; //累计非叶子结点权值和
        --n;    //数组长度减1
        if(n==1)    //当数组中只剩下一个元素时,得出结果
            break;
    }
    printf("%d\n",sum);
}

运行测试:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频编解码学习之一:理论基础

1. 为什么要进行视频压缩&#xff1f; 未经压缩的数字视频的数据量巨大 存储困难 一张DVD只能存储几秒钟的未压缩数字视频。 传输困难 1兆的带宽传输一秒的数字电视视频需要大约4分钟。 \2. 为什么可以压缩 去除冗余信息 空间冗余&#xff1a;图像相邻像素之间有较强的相关性…

化工厂人员定位系统:以安全为出发点,助力企业安全生产管控数智化

化工厂人员定位系统采用先进的高精度时间同步技术和调度技术&#xff0c;可在复杂化工场景中精准锁定作业人员在多层空间内的实时位置&#xff0c;实现高精度人员定位。 如何管理好每个车间的作业人员&#xff1f; 如何监管作业人员是否按时到岗&#xff1f; 如何知晓当前人员…

阿里专家精心整理分享的Java程序员面试笔试通关宝典PDF

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生…

MuLogin的WebRTC功能介绍与设置

WebRTC 协议可以绕过代理取到一些本机的网卡IP和真实的上网公网IP地址&#xff0c;那么我们可以使用替换模式来让网站取到我们指定的IP信息&#xff0c;或用禁用模式&#xff0c;让被访问的网站不能通过WebRTC协议来取我们的IP地址。这里如果你不知道公网IP是多少&#xff0c;建…

18.JVM

目录 1.编写源代码 2.JDK &#xff08;Java Development Kit&#xff09; 3.JRE(Java Runtime Environment) Java运行时环境 4.JVM 1.类名 2.类文件放在哪&#xff1f; 13JVM按需加载类&#xff0c;那么何时加载一个类&#xff1f; 4.类文件是怎么来的&#xff1f; 5…

WebRTC学习笔记五 SDP(Session Description Protocol)

SDP里面内容虽然很多&#xff0c;但是条理很清楚。SDP值为字符串&#xff0c;通过换行符生成一行一行的SDP报文&#xff0c;所有行可分为三类&#xff1a;全局行、音频行、视频行 v - Version&#xff0c;版本&#xff0c;版本&#xff0c;应等于0 o - Origin&#xff0c;源&a…

Github优秀项目-使用Python基于GPT2文本自动生成

基于 GPT2-Chinese 模型的中文文本生成项目,可用于中文生成任务。 当下市面上很多文本自动生成业务都是基于该模型二次开发的,可以很少有那种特定垂直领域的模型用于该领域的创作,也就导致大家在使用类似产品的时候会发现很多的问题,这种问题多数会导致写出来的文章前后逻…

工业大数据收集及预测建模方法(南京大学-宋哲博士分享)- 个人总结

获取工业大数据途径 Retrospective Study(回溯性研究)&#xff1a;完全依赖于现有的历史数据&#xff0c;去数据挖掘、学习和建模&#xff1b;Observational Study(观察性研究)&#xff1a;在一段时间内观察要研究的工业过程&#xff0c;微调相关的控制参数&#xff0c;看系统…

闲人闲谈PS之三十五——物资备货与提前采购

惯例闲话&#xff1a;又一年快过去了&#xff0c;回想刚刚开始在CSDN上写笔记&#xff0c;还是2年前的事情。闲人其实是一个拖延症十分严重的人&#xff0c;自从开始走上写作这条路之后&#xff0c;治疗拖延症找到了办法&#xff0c;每天总有一些事情让闲人去思考&#xff0c;然…

Banana Pi开源社区开源硬件瑞芯微RK3568/RK3588全国产化支持计划

随着国产芯片的崛起与电子供应链的国产化率越来越高&#xff0c;全国产替换从技术上成为了可能。加上近几年地缘政治的影响&#xff0c;全国产替换的呼声越来越高&#xff0c;已经提升到了国家战略层面。国产替换成为了一股技术前进的力量。 Banana Pi开源社区&#xff0c;全力…

操作系统_多线程笔记(二)

文章目录1.线程状态2.多线程在的意义是什么?1.线程状态 状态是针对当前线程调度的情况来描述的,因为线程是系统调度的基本单位,所以状态是属于线程的属性 线程的六种状态: 注意: 1.一旦内核里的PCB消亡了,此时代码中创建的thread也就没有用了,即内核里的线程释放的时候无…

终于有阿里p9架构师分享出困扰我多年的分布式系统开发实战文档

前言 都说程序员工资高、待遇好&#xff0c; 2022 金九银十到了&#xff0c;你的小目标是 30K、40K&#xff0c;还是 16薪的 20K&#xff1f;作为一名 Java 开发工程师&#xff0c;当能力可以满足公司业务需求时&#xff0c;拿到超预期的 Offer 并不算难。然而&#xff0c;提升…

ANR 触发、监控、分析 一网打尽

平时看博客或者学知识&#xff0c;学到的东西比较零散&#xff0c;没有独立的知识模块概念&#xff0c;而且学了之后很容易忘。于是我建立了一个自己的笔记仓库 (一个我长期维护的笔记仓库&#xff0c;感兴趣的可以点个star~你的star是我写作的巨大大大大的动力)&#xff0c;将…

用VS软件开发“浪漫烟花“<笔记摘录>

此处主要讲:如何开发一个连续的烟花弹上升并进行烟花爆炸的程序. 第一步自然是创建窗口,设置窗口宽度为1200,高度为800(#include <graphics.h>) initgraph(1200, 800);//创建窗口,宽度1200,高度800 第二步我们需要为这个窗口添加背景音乐,这里我们添加了一首"周杰伦…

【使用 BERT 的问答系统】第 1 章 : 自然语言处理简介

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【车间调度】基于模拟退火优化算法的的并行车间机器优化调度(Matlab代码实现)

目录 1 概述 2并行机调度问题的的描述 3 模拟退火法 4 基于模拟退火优化算法的的并行车间机器优化调度&#xff08;Matlab代码实现&#xff09; 4.1 运行结果 5 参考文献 6 Matlab代码 1 概述 并行机调度&#xff08;也称并行多机调度, Parallel MachinesScheduling Prob…

你不知道的npm

npm 前端工程化离不开 npm&#xff08;node package manager&#xff09; 或者 Yarn 这些管理工具。npm 或 Yarn 在工程项目中&#xff0c;除了负责依赖的安装和维护以外&#xff0c;还能通过 npm scripts 串联起各个职能部分&#xff0c;让独立的环节自动运转起来。 npm诞生…

跨平台.NET应用UI组件DevExpress XAF v22.1 - 增强Web API Service

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。&#xff…

Web进阶

目录 DOM节点操作&#xff08;上&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM结构及节点 DOM节点操作&#xff08;下&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM修改 DOM控制CSS样式 一、任务目标 二、任务背景 三、任务内容 …

达摩院快速动作识别TPS ECCV论文深入解读

一、论文&代码 论文&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136630615.pdf 模型&代码&#xff1a;ModelScope 魔搭社区 二、背景 高效的时空建模(Spatiotemporal modeling)是视频理解和动作识别的核心问题。相较于图像的Transforme…