首页 > 编程语言 >算法学习 - Huffman树

算法学习 - Huffman树

时间:2024-12-09 20:44:33浏览次数:6  
标签:Node int tree 最小 学习 算法 weights Huffman 小数

题目:输入N个权值(1-100正整数),建立哈夫曼树

Note:
一次遍历找出序列中最小数和次小数:

  1. 如果序列只有一个数,返回这个数
  2. 遍历这个序列,对每个数:
  3. 如果这个数比最小数小,更新原来的次小数为最小数,更新原来的最小数为这个数;
  4. 如果这个数不比最小数小,但比次小数小,更新原来的次小数为这个数。
#include <iostream>

using namespace std;

typedef struct Node{
	int weight = 0;
	int parent = -1;
	int child_l = -1;
	int child_r = -1;
} Node;

#define MAX_INT 100000000

void print(Node* huffmam_tree, int n) {
	// print huffman tree
	printf("节点\t权值\t父节点\t左孩子\t右孩子\n");
	for(int i=0; i<n*2-1; i++) {
		auto node = huffmam_tree[i];
		cout << i << "\t" << node.weight << "\t" << node.parent << "\t" << node.child_l << "\t" << node.child_r << "\n";
	}
}

int main() {
	// int n;
	// cin >> n;
	// int weights[100];
	// for(int i=0;i<n;i++){
	// 	cin >> weights[i];
	// }

	int n = 5;
	int weights[5] = {1,2,3,4,5};

	Node* huffmam_tree = new Node[2*n - 1];
	for(int i=0; i<n; i++) {
		huffmam_tree[i].weight = weights[i];
	}
	
	// build huffman tree
	for(int i=n; i<2*n-1; i++) {
		int min_1=MAX_INT, min_2=MAX_INT, min_1_id=0, min_2_id=0;
		for(int j=0; j<i; j++) {
			if(huffmam_tree[j].parent == -1) { // No parent
				if(huffmam_tree[j].weight < min_1) {
					// 如果当前元素比最小数还小,那么原来的最小数变成次小数,当前元素变成新的最小数。
					// set min_2 as last min_1
					min_2 = min_1;
					min_2_id = min_1_id;
					// set min_1 as newer minimum node
					min_1 = huffmam_tree[i].weight;
					min_1_id = j;
				} else if (huffmam_tree[j].weight < min_2) {
					// 如果当前元素比最小数大但比次小数小,那么当前元素变成新的次小数。
					min_2_id = j;
					min_2 = huffmam_tree[j].weight;
				}
			}
		}
		// set new node
		huffmam_tree[i].weight = huffmam_tree[min_1_id].weight + huffmam_tree[min_2_id].weight;
		huffmam_tree[i].child_l = min_1_id;
		huffmam_tree[i].child_r = min_2_id;
		// set parent for min_1 and min_2
		huffmam_tree[min_1_id].parent = i;
		huffmam_tree[min_2_id].parent = i;
	}

	print(huffmam_tree, n);
	
	
	return 0;
}

标签:Node,int,tree,最小,学习,算法,weights,Huffman,小数
From: https://www.cnblogs.com/KBZ232/p/18595988

相关文章

  • Java Web 开发学习中:过滤器与 Ajax 异步请求
    一、过滤器Filter:过滤器的概念与用途在一个庞大的Web应用中,有许多资源需要受到保护或进行特定的预处理。过滤器就像是一位智能的守卫,站在资源的入口处,根据预先设定的规则,决定哪些请求可以顺利访问资源,哪些请求需要被拦截或进行特殊处理。比如,在众多页面中,判断用户是否登录......
  • JavaScript学习
    关于jsJavaScript是一种动态的、弱类型的解释型语言,最初设计用于浏览器端的交互。特点轻量级:语法简单,入门门槛低。跨平台:支持在浏览器、Node.js等多种环境中运行。解释型:无需编译,直接在运行时执行。事件驱动:非常适合处理异步任务,如用户交互、网络请求等。核心概念变......
  • 【学习笔记】树分治
    点分治普通的分治在一段子段\([l,r]\)中处理和\(mid\)有关的信息然后递归处理\([l,mid)\)和\((mid,r]\)。由于中点的优秀性质这种看似暴力的做法实际复杂度是\(O(n\logn)\)的。点分治是一种把分治思想运用到树上解决问题的算法(但是其实更多人愿意称其为数据结构?)。它一......
  • IO进程学习笔记(持续更新)
    1、IO进程大量的函数接口(70多)记住函数名+函数的功能。大量的笔试题,面试题。先记住,在理解。函数只要是用封装好的。2、man手册普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量3、IO介绍I:input输入O:output输出对文件的输入和输......
  • MySQL学习笔记Day5
    一、基本函数就像是编程语言的函数一样,可以把复杂的功能封装到函数里,供使用者调用。1、数字函数函数功能用例ABS绝对值ABS(-100)ROUND四舍五入ROUND(4.62)FLOOR强制舍位到最近的整数FLOOR(9.9)CEIL强制进位到最近的整数CEIL(3.2)POWER幂函数POWER(2,3)LOG对数函数LOG(7,3)LN......
  • OpenAI发布强化学习微调技术
    前排提示,文末有大模型AGI-CSDN独家资料包哦!OpenAI在12天产品发布活动的第二天,推出基于强化学习的模型微调技术(ReinforcementFine-tuning,简称RFT)。这项技术将帮助开发者和机构用少量数据打造专业领域的AI模型。技术创新亮点•强化学习算法:不同于传统监督式微调,采用强化......
  • 深度学习之视觉处理
    CNN视觉处理三大任务:分类、目标检测、图像分割上游:提取特征,CNN下游:分类、目标、分割等,具体的任务概述卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域,往往我们输入的图像都很大,使用全连接网络的话,计算的代价较高。另外图像也很难保留原有的特征,导......
  • ks短视频sig3算法分析
    sig3是某个很火的短视频的核心加密参数,48位,主要介绍深度ollvm混淆的so层算法如何还原,除此之外,此app还有大量的花指令需要处理,这块看龙哥的就好了,非常清晰.1https://www.yuque.com/lilac-2hqvv/zfho3g/issny5?#%20%E3%80%8A%E8%8A%B1%E6%8C%87%E4%BB%A4%E5%A4%84%E7%9......
  • 对RNN算法个人觉得理解比较到位的博客摘要,记录一些大佬的博客链接
    题记这篇博客主要记录几个讲的比较不错的博客,方便大家理解RNN系列的优化算法,比如GRU、LSTM等,以及为什么要用,怎么用等问题,我个人读下来是写的比较不错。当然还有一些我觉得比较不错的强化学习方面的博客,也在此浅浅的记录一下。。。正文第一处博客第二处博客这个是PYTORCH的代......
  • Pytorch 手写数字识别 深度学习基础分享
    本篇是一次内部分享,给项目开发的同事分享什么是深度学习。用最简单的手写数字识别做例子,讲解了大概的原理。手写数字识别展示首先数字识别项目的使用。项目实现过程:训练出模型准备html手写板flask框架搭建简单后端深度学习必备知识介绍机器学习的概念通俗解释机......