哈夫曼树——数组实现

news2024/11/10 16:02:39

 构造n个给定值节点构成的森林;

选择权值最小的两个构成叶子节点,根节点权值为两叶子节点之和,

删除原有的两棵树,将这棵树加入森林中;

重复这两部直到只有一棵树为止,此树就是哈夫曼树;

#pragma once
#include<iostream>
namespace stlname 
{
	using std::cin;
	typedef struct
		{
		int weight;//权重
		int parent, lch, rch;	//父节点,孩子节点下标
		}HTNode,*HuffmanTree;
	void Seclect(HuffmanTree HT,int i ,int* s1,int* s2);
	
	void CreateHuffmanTree(HuffmanTree HT, int n)//初始化
		{
		if (n <= 1)return;
		int m = 2 * n - 1;
		HT = new HTNode[m+1]();//2n个节点;

			for (int i = 1; i < m + 1; i++)
			{
				HT[i].lch = HT[i].rch = HT[i].parent = 0;//初始化

			}
			for (int i = 1; i <= n; i++)std::cin >> HT[i].weight;

			int* s1, * s2 = NULL;
			for (int i = n + 1; i < m; i++)
				{
				Seclect(HT, i - 1, s1, s2);

				HT[*s1].parent = i; HT[*s2].parent = i;
				HT[i].lch = *s1; HT[i].rch = *s2;
				HT[i].weight = HT[*s1].weight + HT[*s2].weight;

				}

		}

	
		
			
}

 

 哈夫曼编码算法实现:

void CreateHuffmanCode(HuffmanTree HT, HuffmanCode  HC, int n)
	{
		HC = new char* [n + 1];
		char* cd = new char[n];
		cd[n - 1] = '\0';
		
		for (int i = 1; i < n; i++)
		{
			int start = n - 1; int c = i;
			int f = HT[i].parent;
			while (start != 0) {
				start--;
				if (HT[f].lch == c) { cd[start] == '0'; }
				else cd[start] = '1';
				c = f;
				f = HT[f].parent;
						
			}

			strcpy(HC[i],&cd[start]);
		}
		delete cd; cd = NULL;

	}
	

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

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

相关文章

警惕这些“挂羊头卖狗肉”的高科技培训!

最近真的被误人子弟的教育骗子给气到&#xff01; 事情是这样的&#xff0c;6月11号&#xff0c;我在2023 开放原子全球开源峰会上&#xff0c;遇到了一位从广东来北京参会的老师。 这位老师透露&#xff0c;他来自一所职业技术学院&#xff0c;学校师资挺不错的&#xff0c;可…

Spring Boot 如何配置日志级别和输出格式

Spring Boot 如何配置日志级别和输出格式 在开发一个应用程序时&#xff0c;日志记录是非常重要的一环。Spring Boot 提供了多种日志输出方式和配置选项&#xff0c;本文将介绍如何在 Spring Boot 应用程序中配置日志级别和输出格式。 配置日志级别 在 Spring Boot 应用程序中…

【知识点随笔分享 | 第一篇】避不开的浮点误差

引入&#xff1a; 各位在大一初入C语言的时候&#xff0c;老师肯定说过浮点数之间的比较要用做差法&#xff0c;当二者的差值特别小甚至于接近0的时候&#xff0c;这两个数就相等&#xff0c;不知道各位是否会有疑惑&#xff1f;为什么浮点数不可以直接进行比较呢&#xff1f; …

Nacos-手写配置中心基本原理

本文已收录于专栏 《中间件合集》 目录 概念说明Nacos配置中心Naocs配置项Naocs配置集Naocs配置快照 需求分析核心功能代码实现AService模块BService模块NacosService模块NacosSDK模块 注意事项总结提升 概念说明 Nacos注册中心&#xff1a;https://blog.csdn.net/weixin_4549…

vs中运行时库简要说明

vs中右键单击工程 -->属性–>c/c->代码生成&#xff0c;进入如下菜单中&#xff1a; 可以看出有如下几个选项&#xff1a; 多线程(/MT)&#xff1a;链接目标库为libcmt.lib 多线程调试(/MTd)&#xff1a;链接目标库为libcmtd.lib 多线程DLL(/MD)&#xff1a;链接目标…

02.GLM-130B

文章目录 前言泛读相关知识GPTBERTT5小结 背景介绍主要贡献和创新点GLM 6B 精读自定义Mask模型量化1TB 的中英双语指令微调RLHFPEFT训练策略 实验分析与讨论模型参数六个指标其他测评结果 代码复现&#xff08;6B&#xff09;环境准备运行调用代码调用网页服务命令行调用 模型微…

在 Python 中生成随机 4 位数字

文章目录 在 Python 中生成随机数使用 random 模块在 Python 中生成随机数使用 random.randint() 方法使用 random.randrange() 方法 使用替代方法在 Python 中生成随机数总结 Python 是一种高级解释型编程语言&#xff0c;全球大多数程序员都在使用它。 它在面向对象编程 (OOP…

SpringCloud Alibaba入门5之Hystrix的使用

我们继续在前一章的基础上进行学习。 SpringCloud Alibaba入门5之使用OpenFegin调用服务_qinxun2008081的博客-CSDN博客 上一节我们已经使用OpenFeign完成了服务间的调用&#xff0c;如果现在存在大量的服务&#xff0c;每个服务有若干个节点&#xff0c;其中一个节点发生故障…

Word技巧之【文档自动保存】

打工人的噩梦—电脑突然坏掉&#xff0c;文档还没保存&#xff01;你是否遇到这种情况&#xff1f; 如果Word文档设置了自动保存&#xff0c;就不用太过担心了&#xff0c;只需要几个简单的操作就能设置好。还不知道的小伙伴&#xff0c;跟着小编一起看看吧。 设置Word文档自动…

一起来学R编程把—do.call 函数的应用

R语言由一个个基础函数组成&#xff0c;熟练灵活应用这些基础函数&#xff0c;有助于我们更好的学习R包及编程,这个专栏可能很多人不感兴趣&#xff0c;但是对提升自己很有帮助&#xff0c;感兴趣的朋友一起来学习。今天我们来介绍一下do.call函数的用法. do.call函数是一个非…

ChatGLM-6B阿里云部署

机器配置 重点关注指标&#xff1a;CPU、内存、GPU、GPU驱动 类型CPU内存GPU机器配置16核125GNVIDIA A100 80G # 查看显卡安装状态 nvidia-smi 安装必要的软件 git sudo apt-get update sudo apt-get install git git-lfs(大文件管理) sudo apt-get install git-lfs py…

从零开始手搓一个STM32与机智云的小项目——GPIO模拟时序控制外设1

文章目录 前言WS2812B1.模块简介2.时序介绍3.硬件介绍4.传输速率&#xff0c;以及帧数要求 代码1.初始化2.模拟时序1.复位函数2.发送0、1码3.封装发送函数 总结 前言 上一篇文章中介绍了整个板子的最基本功能模块——使用GPIO的通用输入输出实现简单的按键输入以及推挽输出控制…

基于Java+Swing+Mysql实现图书管理系统V2.0

基于JavaSwingMysql实现图书管理系统V2.0 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库表4.主界面5.添加6、修改7、查询8、删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 本系统主要有对图书信息的增删改查操作功能。 项目类型&#xff1a;Java SE项目&…

到底还有谁学不会 MySQL 中的视图?

文章目录 MySQL中的视图视图的概念视图的用法简化查询操作提高查询效率保护数据的安全性 视图的代码示例总结 MySQL中的视图 在MySQL中&#xff0c;视图是一种虚拟表&#xff0c;它是由一个或多个基本表的行或列组成的。视图并不实际存储数据&#xff0c;而是根据定义的查询语…

6-端午练习

目录标题 6_221. 进程和线程2. 数据7>>1 6_231. 用户相关指令2. 创建用户(1. 查看id(2. 查看当前用户(3. 创建用户(4. 给新用户添加sudo权限>1 修改sudoers文件 2. 删除用户3. 修改用户名2. 磁盘1. 保证ubuntu链接上U盘(1. VM弹窗&#xff0c;选择链接到虚拟机(2. 虚拟…

DELL的交换机PowerSwitch学习手册-ONIE篇

下面是最近学习DELL的网络交换机PowerSwitch的一些笔记&#xff0c;供朋友们参考。如果还有问题&#xff0c;可以add wechat at StorageExpert。 在具体学习产品之前&#xff0c;先来了解下DELL的ONIE&#xff0c;什么是ONIE&#xff1f;和如何使用ONIE&#xff1f; ONIE是 O…

关于Nginx网站服务

目录 一、首先搭建Nginx服务 二、授权的访问控制 第一步 安装依赖包 第二步 生成用户密码认证文件 第三步 修改文件属性和权限 第四步 修改配置文件 第五步 用浏览器测试网站 三、基于IP地址进行限制 第一步 修改配置文件 第二步 用两台设备进行访问测试 四、基于域…

Linux - 内存、swap、内存回收机制

参考 2023年6月22日 https://zhuanlan.zhihu.com/p/107350459 —— 讨论的swap基于Linux4.4内核代码 内存深度科普: 从堆内存到虚拟内存管理 2023年6月22日 qbittorrent swap 问题 https://github.com/qbittorrent/qBittorrent/issues/12947 massif valgrind --toolmassif qb…

taro实现小程序地图打点

使用taro的map标签&#xff0c;往markers里放入点位&#xff1a; <map v-if"mapLoading" id"mapId":longitude"userPosition.x":latitude"userPosition.y":show-location"false":markers"markerList":scale&q…

Spring Boot 如何使用 JUL 进行日志记录

Spring Boot 如何使用 JUL 进行日志记录 在 Spring Boot 中&#xff0c;我们可以使用多种日志框架进行日志记录。其中&#xff0c;JUL (Java Util Logging) 是 Java 平台自带的日志框架&#xff0c;它提供了简单的 API 和配置&#xff0c;可以轻松地进行日志记录。本文将介绍如…