求Huffman树的带权路径长度

article/2025/10/2 13:04:01

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;    //数组长度减1if(n==1)    //当数组中只剩下一个元素时,得出结果break;}printf("%d\n",sum);
}

运行测试:

 


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

相关文章

运行startx报错的解决

CentOS启动图形界面startx&#xff1a;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用法&#xff1a; startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]startx三种启动方式&#xff1a; 1 指定client和server&#xff0c; 例如&#xff1a;startx /usr/bin…

startx 及xinit 介绍(经典)

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

startx 及xinit 介绍

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

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

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

ubuntu 启动、退出 startx界面

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

操作系统 - startx/xinit

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

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

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

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

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

Linux常用命令——startx命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) startx 用来启动X Window 补充说明 startx命令用来启动X Window&#xff0c;实际上启动X Window的程序为xinit。 语法 startx(参数)参数 客户端及选项&#xff1a;X客户端及选项&#xff1b;服务器及选项&a…

startx命令详解

startx命令来自于英文词组”start X-windows“的缩写&#xff0c;其功能是用于启动X-Windows系统。X-Windows System也被称为X或X11&#xff0c;中文译为X窗口系统&#xff0c;主要工作就是以图形方式显示软件窗口的系统&#xff0c;现在的GNOME和KDE桌面环境都是以X窗口系统为…

用gcc编译C++文件

我们误以为gcc只能用来编译C文件&#xff0c;这是不对的。 gcc也可以编译C文件&#xff0c;只是gcc不能自动联接C程序使用的库&#xff0c;即链接过程我们不能用gcc 而g实际上在编译C文件时也是使用gcc编译器&#xff0c;在链接时才使用g 例子1&#xff1a; #include <st…

gcc编译c++文件

gcc是编译c语言的&#xff0c;默认情况下&#xff0c;如果直接编译c程序&#xff0c;会报错&#xff1a; [rootserver demo2]# ls hello.cpp [rootserver demo2]# cat hello.cpp #include <iostream> using namespace std; int main(){ cout<<"hello,c&qu…

C++:GCC编译:GCC编译C++程序分步流程

C或者C程序从源代码生成可执行程序的过程&#xff0c;需要经历4个过程分别是&#xff1a;预处理&#xff0c;编译&#xff0c;汇编&#xff0c;链接。但考虑实际使用过程中&#xff0c;用户可能并不关心程序的执行结果&#xff0c;只是想快速得到最终的可执行程序&#xff0c;因…

如何使用GCC编译器

目录 : GCC rules开始...预编译编译汇编连接另外两个重要选项调试小结站点链接 摘要: 要想读懂本文&#xff0c;你需要对C语言有基本的了解&#xff0c;本文将介绍如何使用gcc编译器。 首先&#xff0c;我们介绍如何在命令行方式下使用编译器编译简单的C源代码。 然后&#x…

gcc编译器入门教程

前言&#xff1a; GCC&#xff08;GNU Compiler Collection&#xff0c;GNU 编译器套装&#xff09;&#xff0c;是一套由 GNU 开发的编程语言编译器。GCC 原名为 GNU C 语言编译器&#xff0c;因为它原本只能处理 C语言。GCC 快速演进&#xff0c;变得可处理 C、Fortran、Pas…

Centos7安装并使用gcc编译器

一.安装gcc编译器 1.使用yum安装gcc&#xff08;需要获取管理员权限&#xff09; su root //进入管理员命令 yum -y install gcc gcc-c kernel-devel //安装gcc、c编译器以及内核文件 上图表示已…

gcc编译的四个过程

gcc是什么&#xff1f; GNU编译器套件&#xff08;GNU Compiler Collection&#xff09;包括C、C、Objective-C、Fortran、Java、Ada和Go语言的前端&#xff0c;也包括了这些语言的库&#xff08;如libstdc、libgcj等等&#xff09;。GCC的初衷是为GNU操作系统专门编写的一款编…

如何用gcc编译C代码

如何用gcc编译C代码 1、编写 hello word 的两种方法——现成编译器 这个方法大家都经常用&#xff0c;比如DEVCpp&#xff0c;Visual Studio 2017&#xff0c;Visual C 6.0等。 简单的输出“hello world”程序如下&#xff1a; #include <stdio.h>int main() {printf…

Linux gcc编译命令

编写一个C程序 1.用文本文件编写代码 用 touch 命令&#xff1a;“touch 文件名” 可以创建一个文件&#xff08;比如 touch hello.c&#xff09;&#xff0c;如下图&#xff1a; 在命令行输入 touch hello.c &#xff0c;就在文件夹中创建了一个hello.c文件&#xff0c;打开…