2023/5/14总结

news2024/12/29 10:10:19

哈夫曼树

哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,则称该二叉树为哈夫曼树,也被称为最优二叉树。

怎样才能使带权路径长度最短:根据WPL(权值*边*边数)的计算规则,我们要尽可能地让权值大的叶子节点靠近根节点,让权值小的叶子节点远离根节点,这样就能使得这颗二叉树的带权路径长度达到最小。

哈夫曼树的构建 

1.将输入的n个数据,权值为输入的数,然后构建n棵只有根的树。

2.每次都选出两棵权值最小的数,生成这两棵树的父节点,权值为这两棵树的权值和,这样每次合并一次就会少一颗树。

3.不断地合并,直到只剩下一棵树,这就是我们构建的哈夫曼树。

构建哈夫曼树就是反复选择两个最小的元素进行合并,直到只剩下一个元素。

如下动图 :

 观察该图后我们还发现:

1.哈夫曼树不存在度为1的结点。这是因为我们每次都是选择两棵子树进行合并。

2.如果给定n个数要求构建哈夫曼树,则构建出来的哈夫曼树结点总数为2n-1。

注意:由于我们每两个结点都要构建一个父节点,所以在定义单个结点类型时,我们要定义一个变量存储该节点的双亲结点下标。

typedef double DataType; //结点权值的数据类型

typedef struct HTNode //单个结点的信息
{
	DataType weight; //权值
	int parent; //父节点
	int lc, rc; //左右孩子
}*HuffmanTree;

 构建代码如下:

void Select(HuffmanTree &HT,int n,int &s1,int &s2){
	int min;
	for(int i=1;i<=n;i++){
		if(HT[i].parent==0) {
			min=i;
		    break;
		}
	}
	for(int i=min+1;i<=n;i++){
		if(HT[i].parent==0&&HT[i].weight<HT[min].weight)
		min=i;
	}
	s1=min;
	for(int i=1;i<=n;i++){
		if(HT[i].parent==0&&i!=s1) {
			min=i;
		    break;
		} 
	}
	for(int i=min+1;i<=n;i++){
		if(HT[i].parent==0&&HT[i].weight<HT[min].weight&&i!=s1)
		min=i;
	}
	s2=min;
} 

void CreatHuff(HuffmanTree &HT,DataType *w,int n)
{
	int m=2*n-1;//总结点数
	HT=(HuffmanTree)calloc(m+1,sizeof(HTNode));
	for(int i=1;i<=n;i++){
		HT[i].weight=w[i];
	}
	for(int i=n+1;i<=m;i++){//构建 
		//选择权值最小的两个下标,s1最小放在左子树,
		//生成他们的父节点,父节点权值为他们的和 
		int s1,s2;
		Select(HT,i-1,s1,s2);
		HT[i].weight=HT[s1].weight+HT[s2].weight;
		HT[s1].parent=i;
		HT[s2].parent=i;
		HT[i].leftc=s1;
		HT[i].rightc=s2;
	}
}

在该代码中,主要分为两部分,Select函数用于找到目前最小的两个元素,CreatHuff函数用于创建哈夫曼树,也就是生成两个元素的父节点依次连接起来。

 哈夫曼编码:

对于哈夫曼树上的叶子结点,根据从根结点到该叶子结点的路径所确定的一个编号,就是该叶子结点的哈夫曼编码。

对于任意一棵二叉树,我们把二叉树上的所有分支都进行编号,所有的左分支都标记为0,所有的右分支都标记为1。

代码如下:

void HuffCoding(HuffmanTree &HT,HuffmanCode &HC,int n){
	 HC=(HuffmanCode)malloc(sizeof(char *)*(n+1));//下标为0的空间不用
	 char *code=(char *)malloc(sizeof(char)*n);//辅助空间,编码最长为n(前n-1为数据,n为'\0')
	 code[n-1]='\0';
	 for(int i=1;i<=n;i++){
	 	int start=n-1;
	 	int c=i;
	 	int p=HT[c].parent;
	 	while(p){
	 		if(HT[p].leftc==c) code[--start]='0';
	 		else code[--start]='1';
	 		c=p;
	 		p=HT[c].parent;
		 }
		 HC[i]=(char *)malloc(sizeof(char)*(n-start));
		 strcpy(HC[i],&code[start]);
	 } 
	 free(code);
}

 

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

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

相关文章

CTF-PHP反序列化漏洞5-反序列化字符逃逸

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

简单聊聊微前端

简单聊聊微前端 介绍微前端的优点应用间相互独立&#xff0c;互不依赖可以同时使用不同的技术栈可拓展性高可维护性更强&#xff0c;减少代码量提高开发和部署的效率团队的高度自主权错误隔离 微前端的缺点依赖项冗余CSS样式冲突和重叠性能比较差应用间的通信不够便捷 实现微前…

CSS的基础知识讲解

文章目录 一.什么是CSS二. 选择器2.1 标签选择器2.2 类名选择器2.3 ID选择器2.4 属性选择器2.5 子选择器2.6 后代选择器2.7 伪类选择器 三.盒子模型3.1 什么是盒子模型3.2 盒子的组成部分边框内边距外边距 四.弹性盒子布局4.1 什么是块级元素和行内元素块级元素行内元素行内元素…

◆ 前端工程化 ◆ webpack 的基本使用 ◆ webpack 中的插件 ◆ webpack 中的 loader ◆ 打包发布 ◆ Source Map

◆ 前端工程化 ◆ webpack 的基本使用 ◆ webpack 中的插件 ◆ webpack 中的 loader ◆ 打包发布 ◆ Source Map ◆ 前端工程化◆ webpack 的基本使用◆ webpack 中的插件◆ webpack 中的 loader1. loader 概述打包处理css文件打包处理less文件打包处理样式表中与url路径相关的…

Python——2

一、循环 1.range() 函数 用于生成一个整数序列&#xff0c;返回的是一个迭代对象&#xff0c;可用 in / not in查看。 &#xff08;1&#xff09;range(stop) 创建一个 [0,stop) 的整数序列&#xff0c;步长为1。 &#xff08;2&#xff09;range(start, stop) 创建一个 [s…

面试谎报了职级,本来是6,谎报成7,已经到HR这一步了,怎么了?

面试时谎报职级&#xff0c;公司能查出来吗&#xff1f; 一位网友说&#xff0c;自己在业务面时谎报了职级&#xff0c;把6报成7&#xff0c;现在已经到hr这一步了&#xff0c;该怎么办&#xff1f;是继续编吗&#xff1f; 有人不明白&#xff0c;为什么要谎报职级&#xff1f;…

Pycharm 安装教程,及常用快捷键,附教程

简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外&#xff0c;该IDE提供了一些高级功能&a…

有史以来最强的5G入门科普!

一个简单且神奇的公式 今天的故事&#xff0c;从一个公式开始讲起。 这是一个既简单又神奇的公式。说它简单&#xff0c;是因为它一共只有3个字母。而说它神奇&#xff0c;是因为这个公式蕴含了博大精深的通信技术奥秘&#xff0c;这个星球上有无数的人都在为之魂牵梦绕。…

CloudCompare二次开发之如何配置PCL点云库?

文章目录 0.引言1.修改两个CMakeLists.txt文件2.源码编译3.测试PCL 0.引言 因笔者课题涉及点云处理&#xff0c;需要通过PCL进行点云数据分析处理&#xff0c;查阅现有网络资料&#xff0c;实现了VisualStudio2015(x86)配置PCL1.8.1点云库&#xff08;见&#xff1a;VisualStud…

基于卷积的图像分类识别(七):SENet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileN…

网络编程 lesson3 UDP基础编程

目录 UDP介绍 UDP编程 函数接口 recvfrom sendto 小练习&#xff1a;实现服务器和客户端相连&#xff08;使用UDP实现&#xff09; client server UDP介绍 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种在计算机网络中常用的传输…

C++常量成员函数(类成员函数后加const、类成员函数参数列表后加const)常量对象(类名前加const)和非常量对象

文章目录 常量对象和非常量对象&#xff08;常量对象不能调用非常量成员函数&#xff09;常量成员函数&#xff08;常量成员函数不能修改类的数据成员&#xff1b;常量成员函数只能调用常量成员函数&#xff0c;不能调用非常量成员函数&#xff09; 常量对象和非常量对象&#…

网络编程 lesson1 网络概念

目录 网络发展史&#xff08;了解&#xff09; 局域网和广域网 局域网 广域网 IP地址 IP地址划分&#xff08;IPV4&#xff09; IP地址取址范围&#xff1a; 特殊地址 子网掩码 子网号&#xff08;注意和前面进行区分&#xff09; 练习 练习1&#xff1a; 练习2&…

MySQL 数据库之 MMM 高可用架构构建

一、MMM 概述 1. 什么是 MMM   MMM&#xff08;Master-Master replication manager for MySQL&#xff0c;MySQL 主主复制管理器&#xff09;是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发&#xff0c;主要从来监控和管理 MySQL Master-Master&a…

工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结

工厂模式 工厂模式有许多变体,其中最常见的有三种 简单工厂模式工厂方法模式抽象工厂模式 简单工厂代码分析 UML图中我们可以清晰的看到代码结构 ,首先我们创建一个Car的汽车接口,定制汽车的基本规范,汽车可以的方法是可以跑,所以我们定义了一个抽象的run方法. 定义汽车接口…

【sed编辑器】

目录 一、sed编辑器二、sed的命令格式操作命令1.1、命令演示 二、替换三、插入 一、sed编辑器 1、sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 2、sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么…

OSC Liblo Window10配置

OpenSoundControl一种网络通讯协议&#xff0c;想了解详情的自行打开网站。 liblo 是最知名的OSC库&#xff0c; 功能完整&#xff0c;用 C 和 LGPL 许可编写。 下载请前往GitHub库。 解压后安装过程如下&#xff0c;需要用到CMake&#xff1a; 1.选择源代码文件和构建工程的文…

一文读懂“生成式 AI”

一、前言 本文基于谷歌的&#xff1a;《Introduction to Generative AI》 并且借助 ChatGPT 整理而成&#xff0c;帮助大家理解生成式 AI 这个概念。 主要包括 4 个部分&#xff1a; 生成式 AI 的定义生成式 AI 的工作原理生成式 AI 模型的分类生成式 AI 的应用 二、生成式…

【数据结构】双向带头循环链表的实现

目录 全部代码 图例&#xff08;双向带头循环链表&#xff09; 各个功能的实现 创建该链表的节点 创建初始链表 链表的头插 链表的尾插 链表的随机插入 链表的头删 链表的尾删 链表的随机删除 链表的销毁 链表是否为空的判断 链表节点的创建 总结 全部代码 typ…

命令行更新Windows

命令行更新Windows powershell命令行更新安装 Windows Update module for Windows Powershell连接到 Windows Update 服务器并下载更新安装下载好的 Windows Update 更新 cmd执行Windows update更新检查更新下载 Windows Update 更新安装更新安装更新后重新启动设备 win10以下版…