当前位置: 首页 > news >正文

8609 哈夫曼树

### 思路
1. **选择最小权值节点**:在哈夫曼树构建过程中,选择两个权值最小且父节点为0的节点。
2. **构建哈夫曼树**:根据权值构建哈夫曼树,确保左子树权值小于右子树权值。
3. **生成哈夫曼编码**:从叶子节点到根节点逆向生成每个字符的哈夫曼编码。

### 伪代码
1. **选择最小权值节点**:
   - 遍历节点,找到两个权值最小且父节点为0的节点。
2. **构建哈夫曼树**:
   - 初始化哈夫曼树节点。
   - 输入��值。
   - 迭代构建哈夫曼树,选择两个最小权值节点,更新父节点和子节点信息。
3. **生成哈夫曼编码**:
   - 从叶子节点到根节点逆向生成编码,存储在编码数组中。

### C++代码

#include "stdio.h"
#include "string.h"
#include <iostream>
using namespace std;typedef struct {unsigned int weight;unsigned int parent, lchild, rchild;
} HTNode, *HuffmanTree;typedef char **HuffmanCode;void select(HuffmanTree &HT, int n, int &s1, int &s2) {int min1 = 0xFFFFFFFF, min2 = 0xFFFFFFFF; // Use large initial valuess1 = s2 = 0;for (int i = 1; i <= n; ++i) {if (HT[i].parent == 0) {if (HT[i].weight < min1) {min2 = min1;s2 = s1;min1 = HT[i].weight;s1 = i;} else if (HT[i].weight < min2) {min2 = HT[i].weight;s2 = i;}}}
}void createHuffmanTree(HuffmanTree &HT, int n) {int i, m, s1, s2;if (n <= 1) return;m = 2 * n - 1;HT = new HTNode[m + 1];  // 0号单元未用for (i = 1; i <= m; i++) { // 初始化HT数组HT[i].parent = 0;HT[i].lchild = 0;HT[i].rchild = 0;}for (i = 1; i <= n; i++)cin >> HT[i].weight;for (i = n + 1; i <= m; i++) { // 建哈夫曼树select(HT, i - 1, s1, s2);HT[s1].parent = i;HT[s2].parent = i;HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;}
}void createHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n) {char *cd = new char[n];    // 分配求编码的工作空间cd[n - 1] = '\0';  // 编码结束符。int i, c, f, start;for (i = 1; i <= n; ++i) {start = n - 1;c = i, f = HT[i].parent;while (f) { // 从叶子到根逆向求编码--start;if (HT[f].lchild == c) cd[start] = '0';else cd[start] = '1';c = f, f = HT[f].parent;}HC[i] = new char[n - start]; // 为第i个字符编码分配空间strcpy(HC[i], &cd[start]);    // 从cd复制编码(串)到HC}delete[] cd;
}int main() {int i, n;HuffmanTree HT;HuffmanCode HC;scanf("%d", &n);  // 权值个数HC = new char*[n + 1]; // 0空间未用createHuffmanTree(HT, n);createHuffmanCode(HT, HC, n);for (i = 1; i <= n; i++)printf("%s\n", HC[i]);  // 输出哈夫曼编码for (i = 1; i <= n; i++)delete[] HC[i];delete[] HC;delete[] HT;return 0;
}

### 总结
1. **选择最小权值节点**:通过遍历找到两个��值最小且父节点为0的节点。
2. **构建哈夫曼树**:��始化节点,输入权值,迭代构建哈夫曼树。
3. **生成哈夫曼编码**:从叶子节点到根节点逆向生成编码,存储在编码数组中。

相关文章:

8609 哈夫曼树

### 思路 1. **选择最小权值节点**&#xff1a;在哈夫曼树构建过程中&#xff0c;选择两个权值最小且父节点为0的节点。 2. **构建哈夫曼树**&#xff1a;根据权值构建哈夫曼树&#xff0c;确保左子树权值小于右子树权值。 3. **生成哈夫曼编码**&#xff1a;从叶子节点到根节点…...

docker的harbor仓库登录问题

目录 一、问题描述 二、证书信任问题 三、DNS解析问题 四、解决 参考链接&#xff1a;Docker login Harbor报错解决&#xff1a;Error response from daemon: Get https:..-阿里云开发者社区 一、问题描述 问题&#xff1a; 挂机或者挂机重启之后harbor登录不上 查看日…...

ENV | docker 安装使用(简单实操版)

1. 详细步骤 1.1 安装 sudo apt update sudo apt install docker.io1.2 验证&#xff08;可跳过&#xff09; docker -v1.3 使用 1.3.1 拉取镜像 # 镜像源&#xff0c;如使用腾讯云服务器&#xff0c;可使用 https://mirror.ccs.tencentyun.com docker pull xxx1.3.2 运行…...

【Golang】深入解读Go语言中的错误(error)与异常(panic)

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

DMDSC更换DCR和VOTE磁盘

DMDSC更换DCR和VOTE磁盘 为了提高DMDSC集群运行速度和节点之间通信协调的效率&#xff0c;需要将运行在机械盘上的dcr和vote磁盘替换到SSD高效磁盘上。将原来200M的dcr和vote机械磁盘&#xff0c;换成500M的SSD高效磁盘。 磁盘替换规划信息如下所示&#xff1a; 信息说明 替…...

国产化框架PaddleYOLO结合Swanlab进行作物检测

1. 项目介绍 粮食安全&#xff0c;作为人类生存与发展的基石&#xff0c;始终是全球关注的焦点。它不仅仅关乎粮食的充足供应&#xff0c;更涉及粮食的质量安全、营养健康以及可持续生产等多个维度。在全球化、气候变化和资源环境约束日益加剧的背景下&#xff0c;如何确保粮食…...

Linux编译部署PHP环境

1.准备工作 安装前我们需要设置防护墙&#xff0c;开放端口&#xff0c;更新yum源 # 1.防火墙 systemctl status firewalld 看到active(running)就意味着防火墙打开了 systemctl stop firewalld 看到inactive(dead)就意味着防火墙关闭了 systemctl start fire…...

Win11禁止搜索栏查找互联网内容

禁止任务栏和开始菜单的搜索栏查找互联网内容的方法如下&#xff1a; 使用组策略&#xff1a;WinR键&#xff0c;或菜单框&#xff0c;输入gpedit.msc回车&#xff0c;启动本地组策略编辑器。使用左侧的边栏导航到“计算机配置”>“管理模板”>“Windows组件”>“搜索…...

dig和nmap的区别

dig和nmap是两种在网络管理和安全领域广泛使用的工具&#xff0c;它们在功能、用途和原理上存在显著差异。 dig 定义与功能&#xff1a; dig&#xff08;Domain Information Groper&#xff09;是一个用于查询DNS&#xff08;域名系统&#xff09;信息的命令行工具。它允许用…...

无人机飞手入伍当兵技术优势分析

随着现代战争形态的不断演变&#xff0c;无人机技术在军事领域的应用日益广泛&#xff0c;成为提升军队作战能力的重要手段。对于无人机飞手而言&#xff0c;其专业技能和实战经验在入伍当兵后能够转化为显著的技术优势&#xff0c;为国防事业贡献重要力量。以下是从专业技能优…...

[Everything] 文件搜索工具的下载及详细安装使用过程(附有下载文件)

快速搜索文件名及其所在路径 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压后得到文件 双击exe文件得到 选择简体中文&#xff0c;点击OK 点击“我接受” 更改安装目录&#xff0c;最好不要放在C盘&#xff0c;点击下一步 点击下一步 点…...

HIRI-ViT:使用高分辨率输入的视觉Transformer扩展

摘要 https://arxiv.org/pdf/2403.11999 视觉Transformer&#xff08; V i T \mathrm{ViT} ViT&#xff09;与卷积神经网络&#xff08;CNN&#xff09;的混合深度模型已成为视觉任务中一类强大的骨干网络。自然地&#xff0c;提高此类混合骨干网络的输入分辨率会增强模型容量…...

TI DSP TMS320F280025 Note15:串口SCI的使用

TMS320F280025 串口SCI的使用 ` 文章目录 TMS320F280025 串口SCI的使用框图分析串口特点可编程数据格式SCI端口中断非FIFO/FIFO模式下SCI中断的操作/配置UartDriver.cUartDriver.h串口时钟由PCLKCR7控制使能,默认位系统时钟4分频 串口接收与发送都可以触发中断 串口使用的引脚…...

[Bandzip] 文件解压工具的下载及详细安装使用过程(附有下载文件)

文件解压工具&#xff0c;避免解压出错&#xff0c;双击即可解压文件 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 解压得到文件 双击exe文件 同意并安装 安装完成后&#xff0c;点击关闭&#xff0c; 右键点击需要解压的压缩包&#xff0…...

微服务MongoDB解析部署使用全流程

目录 1、什么是MongoDB 1、非关系型数据库 2、非关系型数据库分类 3、MongoDB&#xff1f;bson格式什么样&#xff1f; 2、MongoDB的优势 3、MongoDB应用场景 4、术语 5、操作 1、安装MongoDB 1、查询镜像文件【不操作】 2、拉取镜像文件 3、创建数据挂载目录 4、启…...

string为什么存储在堆里

在 Java 中&#xff0c;字符串对象存储在堆内存中而不是栈内存中&#xff0c;这是由于 Java 的内存管理和对象生命周期的特性决定的。以下是详细解释&#xff1a; 1. Java 内存模型 Java 的内存模型主要分为以下几个部分&#xff1a; 堆&#xff08;Heap&#xff09;&#x…...

Python和C++及MATLAB距离相关性生物医学样本统计量算法及数据科学

&#x1f3af;要点 统计观测值之间距离计算代谢组学和脂质组学分析相关距离矩阵计算卡方检验偏差校正快速计算距离协方差算法大规模生物系统分析距离矩阵相关性测试石油勘探统计学关系 Python距离矩阵 在数学、计算机科学&#xff0c;尤其是图论中&#xff0c;距离矩阵是一…...

【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧

文章目录 C模板进阶编程前言第一章: 非类型模板参数1.1 什么是非类型模板参数&#xff1f;1.1.1 非类型模板参数的定义 1.2 非类型模板参数的注意事项1.3 非类型模板参数的使用场景示例&#xff1a;静态数组的实现 第二章: 模板的特化2.1 什么是模板特化&#xff1f;2.1.1 模板…...

golang学习笔记20-面向对象(二):方法与结构体【重要】

本节内容是面向对象的核心与基础&#xff0c;很重要。 注意&#xff1a;由于导包语句已经在19讲&#xff08;笔记19&#xff1a;面向对象的引入&#xff09;展示过了&#xff0c;所以这里就不展示了。 一、方法的定义与细节 方法是与特定类型&#xff08;通常是结构体&#x…...

广州C++信奥老师解一本通题 1919:【02NOIP普及组】选数

【题目描述】 已知nn个整数x1,x2,……xn 以及一个整数K(K&#xff1c;n)。从n个整数中任选K个整数相加,可分别 得到一系列的和。例如当n4, k3 4个整数分别为3,7,12,19 3, 7,12,19时,可得全部的组合与它们的和为: 371222   371929   7121938  3121934 现在,要求你计算出和为…...

【Polars 2.0数据清洗成本控制白皮书】:20年ETL专家亲授5大降本增效实战模式,92%企业忽略的内存泄漏陷阱

第一章&#xff1a;Polars 2.0数据清洗成本控制全景认知在现代数据工程实践中&#xff0c;数据清洗不再仅关乎逻辑正确性&#xff0c;更深度绑定计算资源消耗、内存占用与执行延迟。Polars 2.0 通过零拷贝语义、惰性执行引擎重构与 Arrow-native 内存布局优化&#xff0c;将清洗…...

OpenClaw轻量化方案实测:nanobot镜像性能与成本对比

OpenClaw轻量化方案实测&#xff1a;nanobot镜像性能与成本对比 1. 为什么选择nanobot镜像 上个月我在尝试用OpenClaw搭建个人自动化助手时&#xff0c;遇到了一个典型的技术选择困境&#xff1a;是直接调用云端大模型API&#xff0c;还是部署本地模型&#xff1f;经过反复权…...

避开这些坑!医疗内窥镜Zemax优化时的高温灭菌与弯曲成像难题解决指南

医疗内窥镜光学系统设计实战&#xff1a;高温灭菌与弯曲成像的Zemax解决方案 在微创手术和工业检测领域&#xff0c;直径仅2.8mm的医疗内窥镜需要同时满足140广角视场、F2.0大光圈和10μm高分辨率的要求。更严峻的挑战来自使用环境——必须耐受135℃高温蒸汽灭菌&#xff0c;并…...

OpenClaw技能扩展指南:为百川2-13B添加公众号发布模块

OpenClaw技能扩展指南&#xff1a;为百川2-13B添加公众号发布模块 1. 为什么需要公众号发布技能 上周我正忙着准备一篇技术分享文章&#xff0c;突然意识到一个痛点&#xff1a;每次写完Markdown文档后&#xff0c;手动复制到公众号编辑器、调整格式、上传封面、设置摘要的过…...

Flink技术实践-超时异常踩坑与优化

一、背景介绍在Flink实时计算的生产环境中&#xff0c;最令人头疼的往往不是复杂的业务逻辑&#xff0c;而是那些突如其来的“超时异常”。这些异常就像是系统中的“幽灵”&#xff0c;通常在业务高峰期或网络抖动时出现&#xff0c;导致作业重启、数据延迟甚至数据丢失。最近几…...

OpenClaw可视化监控:为nanobot任务添加Web仪表盘

OpenClaw可视化监控&#xff1a;为nanobot任务添加Web仪表盘 1. 为什么需要可视化监控&#xff1f; 去年夏天&#xff0c;我部署了一个基于OpenClaw的nanobot自动化任务&#xff0c;用于定时抓取行业动态并生成日报。最初几周运行良好&#xff0c;直到某天早上发现连续三天的…...

嵌入式开源软件应用的五项关键实践

嵌入式开源软件应用的五项关键实践1. 开源软件在嵌入式系统中的价值与挑战开源软件已成为现代嵌入式系统开发的重要组成部分。通过合理利用开源组件&#xff0c;开发团队可以显著缩短开发周期&#xff0c;降低研发成本&#xff0c;同时获得经过社区验证的可靠解决方案。然而&am…...

提升嵌入式代码注释质量的工具与技术方案

提升代码注释质量的实用工具与技术方案1. 代码注释工具概述1.1 代码注释的重要性在嵌入式系统开发中&#xff0c;良好的代码注释是保证项目可维护性的关键因素。专业的注释工具能够帮助开发者&#xff1a;创建可视化注释&#xff0c;提升代码可读性生成标准化的文档结构维护代码…...

TEA加密算法实战:用Python和C语言实现QQ同款加密(附完整代码)

TEA加密算法实战&#xff1a;从原理到跨语言实现 在即时通讯和物联网设备中&#xff0c;数据安全传输一直是核心需求。TEA&#xff08;Tiny Encryption Algorithm&#xff09;以其轻量级、高效率的特性&#xff0c;成为资源受限环境下的理想选择。本文将深入探讨TEA算法家族的工…...

微信小程序身份证检测实战:从createVKSession版本兼容到真机调试全解析

1. 微信小程序身份证检测功能开发概述 最近在开发一个需要身份证识别功能的小程序时&#xff0c;遇到了一个让人头疼的问题&#xff1a;在开发者工具中运行正常&#xff0c;但真机调试时却报错"createVKSession:fail The current device does not support version v1&quo…...