数据结构-哈夫曼树

介绍

哈夫曼树,指带权路径长度最短的二叉树,通常用于数据压缩中

什么是带权路径长度?

假设有一个结点,我们为它赋值,这个值我们称为权值,那么从根结点到它所在位置,所经历的路径,与这个权值的积,就是它的带权路径长度。

比如有这样一棵树,D权值为2

 从根结点到D的路径为2,则此结点带权路径长度为2x2=4

当一棵二叉树所有结点的带权路径之和最小时,这棵树就被称为哈夫曼树

如何构建

假设已经有若干带权值的结点

首先需要选出权值最小的两个结点(1,3)构建二叉树

此时根结点权值为1x1+3x1=4,将其放回,再从所有结点中选取最小的重新组成新的二叉树

重复此步骤,直到构成完整二叉树(只剩下9和6,则最后两个构成二叉树)

这样,就构成了一棵哈夫曼树

这棵树的最小带权路径和为1x3+3x3+5x2+6x1=28 

因此,构建步骤为:

1)创建一个包含所有结点及权值的森林

2)选取两棵权值最小的树合并构成新树,其根结点的权值为这两棵树结点权值之和

3)将新树放回森林中,重复步骤2,直到构成一棵树为止

代码实现

int m1,m2;//全局变量方便传递
struct tree {//结构体定义int weight;int p;int l;int r;
};
struct hftree {tree* data;int len;
};//查找最小的两个权值
void select(hftree* T) {int min_;for (int i=0; i<T->len; i++) {if (T->data[i]->p==0) { //选取没有父结点的结点(已有父结点的已经构成树)min_=i;//先为min_赋一个初始值}}for (int i=0; i<T->len; i++) { //找第一个最小值if (T->data[i]->p==0) {if (T->data[i]->weight<min_) min_=i;}}m1=min_;for (int i=0; i<T->len; i++) {if (T->data[i]->p==0&&i!=m1) {min_=i;}}for (int i=0; i<T->len; i++) { //找第二个最小值if (T->data[i]->p==0) {if (T->data[i]->weight<min_&&T->data[i]->weight!=m1) min_=i;}}m2=min_;
}//创建哈夫曼树
void creathftree(int* weight,int n) {//传入权值与·结点数int m=2*n-1;//总结点数(当有n个结点待构成哈夫曼树时,构成的树一共有2n-1个结点)hftree* T=(hftree*)malloc(sizeof(hftree));//开辟空间T->data=(tree*)malloc(sizeof(tree)*m);//分配data数组内存T->len=n;for (int i=0;i<n;i++){T->data[i]->weight=weight[i];//赋权值}for (int i=n;i<m;i++){select(T,i-1);//在第0到i-1个所有结点内查找T->data[i]->weight=T->data[m1]->weight+T->data[m2]->weight;//新结点权值为最小两权值之和T->data[m1]->p=i;//结点i为最小两个结点的父结点T->data[m2]->p=i;T->data[i]->l=m1;//权值为m1与m2的结点归为i的左右孩子T->data[i]->r=m2;}
}

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

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

相关文章

无穷绕八双纽线

目录&#xff09; 前言双纽线双纽线工程化双纽线应用参考文献 前言 今天是初八&#xff0c;在中国某些地方初八有拜财神的习俗&#xff0c;“八”谐音“发”&#xff0c;等同于恭喜发财的“发”&#xff0c;寓意着在新的一年里红红火火发大财&#xff0c;三叔首先祝福各位读者…

oracle和mysql语句有哪些异同点?

Oracle和MySQL是两个流行的关系型数据库管理系统&#xff0c;它们都有SQL&#xff08;结构化查询语言&#xff09;作为主要的查询语言。尽管它们共享许多基本的SQL功能&#xff0c;但它们之间也存在一些关键的差异。以下是一些Oracle和MySQL语句的异同点&#xff1a; 数据类型…

C语言:函数指针

前言&#xff1a; 当谈到C语言的高级特性时&#xff0c;函数指针是一个非常重要的概念。函数指针允许我们在程序中动态地传递和调用函数&#xff0c;这在很多情况下都非常有用。本篇博客将详细讲解C语言函数指针的知识&#xff0c;并带上一些代码示例来帮助读者理解。 目录 什么…

如何使用HTTP隧道在Linux环境下构建内网穿透解决方案

你是否曾经遇到过这样的尴尬场景&#xff1a;身处内网环境&#xff0c;却想要让外部世界的朋友访问你的某个服务&#xff0c;却发现那堵墙——防火墙&#xff0c;如同一座不可逾越的山峰&#xff0c;挡住了你的去路&#xff1f;别担心&#xff0c;今天我们就来聊聊如何在Linux环…

Python:变量与数据类型

目录 一、变量 1.1 强数据类型与弱数据类型 1.2 全局函数 1.3 变量的命名规范 二、数据类型 2.1 基本数据类型 2.2 复合数据类型&#xff08;引用数据类型&#xff09; 三、数据类型转换 一、变量 变量&#xff1a;顾名思义&#xff0c;变化的量。在python中代指运行时…

html标签及基础语法 大合集

01-标签语法标签结构 HTML&#xff08;Hypertext Markup Language&#xff09;是网页的基础语言之一&#xff0c;它通过使用标签&#xff08;tag&#xff09;来描述网页的结构和内容。标签是由尖括号包围的关键词&#xff0c;通常成对出现&#xff0c;其中包括一个开始标签和一…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(6)特征分析

今天来学习特征分析。 通过图分析每个特征与结果的对应关系。 例如上方&#xff0c;使用散点图&#xff0c;将各个特征和价格的关系&#xff0c;绘制出来&#xff0c;观察是否具有较大的相关性。 散点图可以帮助找出现有特征中&#xff0c;与价格的关联度&#xff08;正数正相…

蓝桥杯刷题--python-7

0幸运数字 - 蓝桥云课 (lanqiao.cn) count 0def add_sum(num):nums []for i in num:nums.append(int(i))return sum(nums)for i in range(1, 999999):if count < 2023:bin_num bin(i)[2:]oct_num oct(i)[2:]hex_num hex(i)[2:]tm []for j in hex_num:tm.append(int(j,…

RAG和Embedding

搭建过程&#xff1a; &#xff08;1&#xff09;文档加载&#xff0c;并按一定条件切割成片段 &#xff08;2&#xff09;将切割的文本片段灌入检索引擎 &#xff08;3&#xff09;封装检索接口 &#xff08;4&#xff09;构建调用流程&#xff1a; Query -> 检索 ->…

Vue3+vite搭建基础架构(6)--- 使用vue-router

Vue3vite搭建基础架构&#xff08;6&#xff09;--- 使用vue-router 说明官方文档安装vue-router使用vue-router测试vue-router 说明 这里记录下自己在Vue3vite的项目使用vue-router的过程&#xff0c;不使用ts语法&#xff0c;方便以后直接使用。这里承接自己的博客Vue3vite搭…

阿里云上关于EDAS发布方式

1. 描述蓝绿部署和灰度发布的区别以及适用场景。 蓝绿部署和灰度发布是两种常见的软件发布策略&#xff0c;它们各有特点并适用于不同的场景。 蓝绿部署的特点&#xff1a; 目的&#xff1a;蓝绿部署的主要目的是减少发布时的中断时间&#xff0c;并且能够在新版本出现问题时…

用MQL语言实现报价导出为JSON文件

文章目录 一、MQL语言导出报价为JSON文件意义二、MQL语言导出报价为JSON的代码实现设置输入变量加载历史数据报价写入JSON文件添加数据到json文件脚本主程序 一、MQL语言导出报价为JSON文件意义 数据存储&#xff1a;将报价导出为JSON文件可以将数据以结构化的方式存储在文件中…

JavaScript(JS)与Java的区别与联系

区别&#xff1a; 1.JS是前端语言&#xff0c;Java是后端语言 2.JS是在浏览器上运行的&#xff0c;而Java是要在Java虚拟机&#xff08;JVM&#xff09;上运行 3.JS是弱类型语言&#xff08;不需要声明变量类型&#xff09;&#xff0c;而Java是强类型语言&#xff08;需要声…

sqlserver 事务

下面是 SQL Server 中使用事务的示例 SQL 代码&#xff1a; BEGIN TRANSACTION;UPDATE 表名 SET 列名 新值 WHERE 条件;INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3);DELETE FROM 表名 WHERE 条件;COMMIT TRANSACTION;在上面的示例中&#xff0c;通过 BEGIN TRA…

[ linux网络 ] 网关服务器搭建,综合应用SNAT、DNAT转换,dhcp分配、dns分离解析,nfs网络共享以及ssh免密登录

实验准备工作&#xff1a; 网关服务器安装&#xff1a;dhcp bind &#xff08;yum install -y dhcp bind bind-utlis&#xff09; server1安装&#xff1a;httpd (yum install -y httpd) 没有网络就搭建本地yum仓库或者配置网卡使其能够上网。 ( 1&#xff09;网关服务器…

不同域名的页面进行通信,通过iframe和postMessge进行消息通信

不同域名的页面&#xff0c;通过iframe和postMessge进行消息通信 前言 浏览器不同标签页之间进行消息通信&#xff0c;尤其是当这些标签页位于不同域名时&#xff0c;通常需要使用一些特定的技术或协议来实现。以下是几种可能的方法&#xff1a; WebSocket&#xff1a;WebSo…

源聚达科技:抖音店铺2024年卖什么好

随着时代的变迁和科技的进步&#xff0c;消费者的购物习惯与偏好也在不断演变。展望2024年&#xff0c;抖音作为新兴的电商平台&#xff0c;其店铺销售策略需紧跟潮流&#xff0c;才能在激烈的市场竞争中脱颖而出。那么&#xff0c;哪些产品将成为抖音店铺的新宠呢? 首当其冲&…

STM32CubeMax(使用7步)新建工程

现在有时间学习一下STM32用CubeMX新建一个工程的步骤&#xff0c;特此记录一下&#xff1a; 第一步打开STM32CubeMax 第二步搜索芯片型号&#xff1a; 第三步配置时钟&#xff1a; 第四步点选配置时钟源&#xff1a; 第五步填写工程相关的名称路径信息&#xff1a; 第六步选择…

基于SpringBoot3从零配置SpringDoc

基于SpringBoot3从零配置SpringDoc 一、SpringFox二、SpringDoc三、Open API 规范四、SpringBoot3配置Knife4j1.官方参考文档2.添加依赖3.添加配置项4.设置文档首页5.编写控制器6.文档展示 一、SpringFox github SpringFox 已经停止更新了。SpringFox 对 SpringBoot3.0 不适配…

微信小程序开发之Vant组件库

文章目录 环境Vant介绍示例 微信小程序的npm支持安装npm包构建npm 在微信小程序开发中使用Vant准备安装和配置一&#xff1a;安装二&#xff1a;修改app.json三&#xff1a;修改project.config.json四&#xff1a;构建npm包 使用Button组件Calendar组件 参考 环境 Windows 11 …