数据结构与算法-哈夫曼树与图

在这里插入图片描述
🌞 “永远积极向上,永远豪情满怀,永远热泪盈眶!”


哈夫曼树与图

  • 🎈1.哈夫曼树
    • 🔭1.1树与二叉树的转换
    • 🔭1.2森林与二叉树的转换
    • 🔭1.3哈夫曼树
      • 🔎1.3.1哈夫曼树的概念
      • 🔎1.3.2哈夫曼树的构造
      • 🔎1.3.3例题
  • 🎈2.图
    • 🔭2.1图的定义
    • 🔭2.2图的基本术语
    • 🔭2.3图的抽象数据类型
    • 🔭2.4图的存储结构
      • 📖2.4.1邻接矩阵存储
        • ✅2.4.1.1邻接矩阵表示的类定义
        • ✅2.4.1.2创建图
        • ✅2.4.1.3定位操作-查找顶点信息在顶点数组中的下标
        • ✅2.4.1.4创建有向图或无向图
        • ✅2.4.1.5创建有向网或无向网
        • ✅2.4.1.6计算顶点的度数-有向图为例
        • ✅2.4.1.7以有向图为例

🎈1.哈夫曼树

🔭1.1树与二叉树的转换

由于二叉树和树均可以用二叉链表作为存储结构,因此以二叉链表为媒介可以倒数树和二叉树的对应关系。一棵树可以找到唯一的一棵二叉树与之对应。反之,一棵右子树为空的二叉树也可以转换成对应的树。

📝将一棵树转化为二叉树的方法如下:

  1. 加线:将树中所有相邻的兄弟之间加一条线。
  2. 抹线:保留树中每个结点与其第一个孩子结点之间的连线,删除它与其他孩子结点之间的连线。
  3. 旋转:以右侧有结点连线的结点为轴心,将其右侧结点顺时针旋转45°,使之成为一棵层次分明的二叉树。
    在这里插入图片描述

在这里插入图片描述

🔭1.2森林与二叉树的转换

从树和二叉树的转换方式知,任何一棵树转换成二叉树,二叉树的右子树必为空。由此,我们可以把森林中的第二棵树的根结点看作第一棵树的根结点的兄弟,第三棵树的根结点看成是第二棵树的根结点的兄弟。
在这里插入图片描述

🔭1.3哈夫曼树

🔎1.3.1哈夫曼树的概念

哈夫曼树,又称最优二叉树,是一类树的带权路径长度最小的二叉树。

  • 路径:从一个祖先结点到子孙结点之间的分支构成这两个结点间的路径。
  • 路径长度:路径上分支的数目。
  • 树的路径长度:从根到每个结点的路径长度之和。
  • 结点的权:根据应用的需要可以给树的结点赋予权值。
  • 结点的带权路径长度:从根到该结点的路径长度与该结点权的乘法。
  • 树的带权路径长度:树中所有叶子结点的带权路径长度之和。
    带权路径长度最小的二叉树称为哈夫曼树,也称最优二叉树。

🔎1.3.2哈夫曼树的构造

在这里插入图片描述

🔎1.3.3例题

在这里插入图片描述
🧩定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点,其中有n-1个非叶子结点。

🎈2.图

🔭2.1图的定义

称有序二元组G=(V,E)是一个图,若其中V是一个非空有限集合(或称顶点集),V中的数据元素称为顶点,EV上的二元关系,称E为边集。
(1).若E中的顶点对(或序偶)(u,v)是无序的,则称G为无向图,称(u,v)G的一条无向边,显然,(u,v)(v,u)是指同一条边。
(2).若E中的顶点对(或序偶)(u,v)是有序的,则称G为有向图。称(u,v)G的一条有向边(或弧),其中,称u为弧尾(或始点),称v为弧头(或终点)。

🔭2.2图的基本术语

  1. 端点、邻接点、自环和孤立点:在一个无向图G=(V,E)中,若e=(u,v)G中的一条边,uv称为边e的两个端点,称边e关联uv,也称u邻接v,或v邻接uuv称为边e=(u,v)的邻接点;若u=v,称(u,v)G的自环。对于任意的u属于V,若不存在任何边关联u,说明顶点u是孤立点。
  2. 完全图:令G=(V,E)为一个图,且|V|=n,|E|=m。若无向图中每两个顶点间都存在一条边,或在有向图中每两个顶点间都存在着方向相反的两条有向边,则称此图为完全图。显然,无向图包含n(n-1)/2条边,有向图包含n(n-1)条边。
  3. 稀疏图和稠密图:边数很少的图(m<nlogn)称为稀疏图,反之称为稠密图。
  4. 顶点的度、出度和入度:在无向图G=(V,E)中,对于每一个v属于V,称关联顶点v的边数为顶点v的度数,记为d(v).在有向图G=(V,E)中,对于每一个v属于V,称以v为始点的边的条数为v的出度,称以v为终点的边的条数为v的入度。在无向图中,顶点的度数之和与边数有如下关系:

在这里插入图片描述
在有向图中,顶点的度数之和与边数有如下关系:
在这里插入图片描述

  1. 子图、真子图和生成子图:G=(V,E),H=(V1,E1)是两个图。
    在这里插入图片描述

  2. 路径、路径长度、简单路径和初等路径:
    在这里插入图片描述

  3. 回路、简单回路和初等回路:
    在这里插入图片描述

  4. 连通、连通图和连通分量:
    在这里插入图片描述

  5. 连通、强连通和强连通分量:
    在这里插入图片描述

  6. 权和网:在某些图中,边或弧上具有与它相关的数据信息称之为权。在实际应用中,权值可以有某种含义。例如,在城市交通线路的图中,边上的权值可以来表示该线路上的长度或交通费用等。边上带权的图称为带权图,也称网。

  7. 生成树:包含Gn个顶点的极小连通子图称为图G的生成树。一棵具有n个顶点的生成树有且仅有n-1条边。


🔎例题:图G=(V,E)是一个非连通无向图,共有36条边,则该图至少有多少个顶点?

该非连通无向图至少由一个顶点和一个连通无向图组成。(n-1)n/2=36,n=9,所以该图至少有10个顶点。

🔭2.3图的抽象数据类型

ADT Graph{
    数据对象:
      D = V = {ai|1<=i<=n,ai属于Elemtype}
    数据关系:
      R = E = {(ai,aj)|1<=i<=n,1<=j<=n,ai,aj属于D}
    基本操作:
    InitGraph(&g,V,E);//初始化创建一个图
    DestroyGraph(&g);//摧毁图,释放图占用的存储空间
    LocateVex(g,v);//查找顶点v在图中的位置
    InsertVex(&g,v);//在图中插入一个顶点v
    DeleteVex(&g,v);//在图中删除一个顶点v
    Degree(g,v);//计算顶点v的度数
    DFETraverse(g,v);//从顶点v出发对图进行深度优先遍历
    BFSTraverse(g,v);//从顶点v出发对图进行广度优先遍历
    }ADT Graph

🔭2.4图的存储结构

📖2.4.1邻接矩阵存储

在这里插入图片描述
在这里插入图片描述
🔎图的邻接矩阵存储结构具有如下特点:

  1. 无向图的邻接矩阵是对称矩阵,实际存储时可以采用压缩矩阵存储。
  2. 有向图的邻接矩阵不一定对阵,因此,采用邻接矩阵存储具有n个顶点的有向图时,其存储结构的空复杂度为O(n2)。
  3. 无向图邻接矩阵的第i行(或第i列)中非0元素的个数,就是顶点i的度数。
  4. 有向图邻接矩阵的第i行中非0元素的个数,就是顶点i的出度,第i列中非0元素的个数,就是顶点i的入度。
  5. 利用邻接矩阵可以较容易地确定图中两顶点之间是否有边。但若要确实图的总边数,则要按行按列进行查询,耗费的时间代价较大。另外,邻接矩阵用数组表示时,静态数组的局限性不便于图的插入和删除操作,它们是邻接矩阵存储结构的局限性。
✅2.4.1.1邻接矩阵表示的类定义
#define _CRT_SECURE_NO_WARNINGS 1
#define MaxVex 20//预设最大顶点数
const int MAXINT = 0xfffffff;//最大整数,表示无穷大
typedef struct 
{
	VRType adj;//VRType为顶点关系类型,对无权图值为0或1
	InfoType info;//该弧相关信息
}ArcBox;
typedef struct
{
	VElemType vexs[MaxVex];//VElemType为顶点信息类型
	ArcBox arcs[MaxVex][MaxVex];//邻接矩阵,即边表
	int vexnum;//顶点数
	int arcnum;//边数
	int kind;//邻接矩阵的存储的图的种类:1有向图,2无向图,3有向网,4无向网
}MGraph;
class Graph
{
private:
	MGraph mg;
public:
	void CreateGraph();//创建图
	int LocateVex(VElemType x);//返回图中顶点x在顶点数组中的下标
	void CreateDG();//构造有向图
	void CreateUDG();//构造无向图
	void CreateDN();//构造有向网
	void CreateUDN();//构造无向网
	int DegreeGraph(VElemType x);//计算顶点的度数
	void ShortPath_DIJ(VElemType v);//求最短路径
	void Dispath(int dist[], int path[], int s[], VElemType x);//输出最短路径
	void Floyd();//Floyd算法求最短路径
	void Dispath(int dist[MaxVex][MaxVex]);//输出最短路径
};
✅2.4.1.2创建图
void Graph::CreateGraph()
{
	cout << "输入图的种类:1:有向图 2:无向图 3:有向网 4:无向网";
	cin >> mg.kind;
	switch (mg.kind)
	{
	case 1:CreateDG();//构造有向图
		break;
	case 2:CreateUDG();//构造无向图
		break;
	case 3:CreateDN();//构造有向网
		break;
	case 4:CreateUDN();//构造无向网
	}
}
✅2.4.1.3定位操作-查找顶点信息在顶点数组中的下标
int Graph::LocateVex(VElemType x)
{
	for (int i = 0; i < mg.vexnum; i++)
	{
		if (x == mg.vexs[i])
			return i;
		return -1;
	}
}
✅2.4.1.4创建有向图或无向图
void Graph::CreateDG()
{
	int i, j, h, t;
	VElemType u, v;
	int flag;//0表示没有弧信息,1表示有弧信息
	cin >> mg.vexnum >> mg.arcnum >> flag;
	for (int i = 0; i < mg.vexnum; i++)
	{
		cin >> mg.vexs[i];//构造顶点信息
	}
	for (i = 0; i < mg.vexnum; i++)
	{
		for (j = 0; j < mg.vexnum; j++)
		{
			mg.arcs[i][j].adj = 0;//用0初始化邻接矩阵
			mg.arcs[i][j].info = NULL;//用NULL初始化该弧的相关信息
		}
	}
	for (i = 0; i < mg.arcnum; i++)
	{
		cin >> u >> v;
		h = LocateVex(u);
		t = LocateVex(v);
		if (flag)
		{
			cin >> mg.arcs[h][t].info;
		}
		mg.arcs[h][t].adj = 1;//1表示顶点相邻
		mg.arcs[t][h].adj = 1;//若为无向图加上这条
	}
}
✅2.4.1.5创建有向网或无向网
void Graph::CreateDN()
{
	int i, j, h, t, w;
	VElemType u, v;
	int flag;//0表示没有弧信息,1表示有弧信息
	cin >> mg.vexnum >> mg.arcnum >> flag;
	for (int i = 0; i < mg.vexnum; i++)
	{
		cin >> mg.vexs[i];//构造顶点信息
	}
	for (i = 0; i < mg.vexnum; i++)
	{
		for (j = 0; j < mg.vexnum; j++)
		{
			if (i == j)
			{
				mg.arcs[i][j].adj = 0;//用0初始化邻接矩阵
			}
			else
			{
				mg.arcs[i][j].adj = MAXINT;
			}
			mg.arcs[i][j].info = NULL;//用NULL初始化该弧的相关信息
		}
	}
	for (i = 0; i < mg.arcnum; i++)
	{
		cin >> u >> v >> w;
		h = LocateVex(u);
		t = LocateVex(v);
		if (flag)
		{
			cin >> mg.arcs[h][t].info;
		}
		mg.arcs[h][t].adj = w;
		mg.arcs[t][h].adj = w;//若为无向网加上该赋值
	}
}
✅2.4.1.6计算顶点的度数-有向图为例
int Graph::DegreeGraph(VElemType x)
{
	int h = LocateVex(x);
	int count = 0;
	for (int i = 0; i < mg.vexnum; i++)
	{
		if (mg.arcs[h][i].adj && mg.arcs[h][i].adj != MAXINT)
			count++;
		if (mg.arcs[i][h].adj && mg.arcs[i][h].adj != MAXINT)
			count++;
	}
	return count;
}
✅2.4.1.7以有向图为例
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
typedef int VElemType;
typedef int VRType;
typedef int InfoType;
#define MaxVex 20//预设最大顶点数
const int MAXINT = 0xfffffff;//最大 整数,表示无穷大
typedef struct 
{
	VRType adj;//VRType为顶点关系类型,对无权图值为0或1
	InfoType info;//该弧相关信息
}ArcBox;
typedef struct
{
	VElemType vexs[MaxVex];//VElemType为顶点信息类型
	ArcBox arcs[MaxVex][MaxVex];//邻接矩阵,即边表
	int vexnum;//顶点数
	int arcnum;//边数
	int kind;//邻接矩阵的存储的图的种类:1有向图,2无向图,3有向网,4无向网
}MGraph;
class Graph
{
private:
	MGraph mg;
public:
	void CreateGraph();//创建图
	int LocateVex(VElemType x);//返回图中顶点x在顶点数组中的下标
	void CreateDG();//构造有向图
	void CreateUDG();//构造无向图
	void CreateDN();//构造有向网
	void CreateUDN();//构造无向网
	int DegreeGraph(VElemType x);//计算有向图顶点的度数
};
void Graph::CreateGraph()
{
	cout << "输入图的种类:1:有向图 2:无向图 3:有向网 4:无向网"<<endl;
	cout << "请输入:";
	cin >> mg.kind;
	switch (mg.kind)
	{
	case 1:CreateDG();//构造有向图
		break;
	case 2:CreateUDG();//构造无向图
		break;
	case 3:CreateDN();//构造有向网
		break;
	case 4:CreateUDN();//构造无向网
	}
}
int Graph::LocateVex(VElemType x)
{
	for (int i = 0; i < mg.vexnum; i++)
	{
		if (x == mg.vexs[i])
			return i;
	}
	return -1;
}
void Graph::CreateDG()
{
	int i, j, h, t;
	VElemType u, v;
	int flag;//0表示没有弧信息,1表示有弧信息
	cout << "请输入顶点数、边数以及是否有弧信息(0/1)";
	cin >> mg.vexnum >> mg.arcnum >> flag;
	cout << "请输入" << mg.vexnum << "个顶点:";
	for (int i = 0; i < mg.vexnum; i++)
	{
		cin >> mg.vexs[i];//构造顶点信息
	}
	for (i = 0; i < mg.vexnum; i++)
	{
		for (j = 0; j < mg.vexnum; j++)
		{
			mg.arcs[i][j].adj = 0;//用0初始化邻接矩阵
			mg.arcs[i][j].info = NULL;//用NULL初始化该弧的相关信息
		}
	}
	for (i = 0; i < mg.arcnum; i++)
	{
		cout << "请输入关联的两个顶点:";
		cin >> u >> v;
		h = LocateVex(u);
		t = LocateVex(v);
		if (flag)
		{
			cout << "请输入权值:";
			cin >> mg.arcs[h][t].info;
		}
		mg.arcs[h][t].adj = 1;//1表示顶点相邻
	}
}
int Graph::DegreeGraph(VElemType x)
{
	int h = LocateVex(x);
	int count = 0;
	for (int i = 0; i < mg.vexnum; i++)
	{
		if (mg.arcs[h][i].adj && mg.arcs[h][i].adj != MAXINT)
			count++;
		if (mg.arcs[i][h].adj && mg.arcs[i][h].adj != MAXINT)
			count++;
	}
	cout << "该顶点的度数为:" << count << endl;
	return 0;
}
int main()
{
	Graph a;
	a.CreateGraph();
	a.DegreeGraph(1);
	a.DegreeGraph(2);
	a.DegreeGraph(3);
	a.DegreeGraph(4);
	return 0;
}

✅运行示例:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web之CSS笔记

Web之HTML、CSS、JS 二、CSS&#xff08;Cascading Style Sheets层叠样式表&#xff09;CSS与HTML的结合方式CSS选择器CSS基本属性CSS伪类DIVCSS轮廓CSS边框盒子模型CSS定位 Web之HTML笔记 二、CSS&#xff08;Cascading Style Sheets层叠样式表&#xff09; Css是种格式化网…

传输层——TCP协议

文章目录 一.TCP协议二.TCP协议格式1.序号与确认序号2.窗口大小3.六个标志位 三.确认应答机制&#xff08;ACK&#xff09;四.超时重传机制五.连接管理机制1.三次握手2.四次挥手 六.流量控制七.滑动窗口八.拥塞控制九.延迟应答十.捎带应答十一.面向字节流十二.粘包问题十三.TCP…

【有源码】基于asp.net的旅游度假村管理系统C#度假村美食住宿一体化平台源码调试 开题 lw ppt

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

OpenAI 解雇了首席执行官 Sam Altman

Sam Altman 已被 OpenAI 解雇&#xff0c;原因是担心他与董事会的沟通和透明度&#xff0c;可能会影响公司的发展。该公司首席技术官 Mira Murati 将担任临时首席执行官&#xff0c;但 OpenAI 可能会从科技行业寻找新的首席执行官来领导未来的产品开发。Altman 的解雇给 OpenAI…

YOLOv8优化与量化(1000+ FPS性能)

YOLO家族又添新成员了&#xff01;作为目标检测领域著名的模型家族&#xff0c;you only look once (YOLO) 推 出新模型的速度可谓是越来越快。就在刚刚过去的1月份&#xff0c;YOLO又推出了最新的YOLOv8模型&#xff0c;其模型结构和架构上的创新以及所提供的性能提升&#xf…

电子电器架构 —— 车载网关边缘节点路由转发策略

电子电器架构 —— 车载网关边缘节点路由转发策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无…

035、目标检测-物体和数据集

之——物体检测和数据集 目录 之——物体检测和数据集 杂谈 正文 1.目标检测 2.目标检测数据集 3.目标检测和边界框 4.目标检测数据集示例 杂谈 目标检测是计算机视觉中应用最为广泛的&#xff0c;之前所研究的图片分类等都需要基于目标检测完成。 在图像分类任务中&am…

动手学深度学习——循环神经网络的从零开始实现(原理解释+代码详解)

文章目录 循环神经网络的从零开始实现1. 独热编码2. 初始化模型参数3. 循环神经网络模型4. 预测5. 梯度裁剪6. 训练 循环神经网络的从零开始实现 从头开始基于循环神经网络实现字符级语言模型。 # 读取数据集 %matplotlib inline import math import torchfrom torch import …

机器学习算法——集成学习

目录 1. Bagging 1. Bagging Bagging&#xff08;bootstrap aggregating&#xff1a;自举汇聚法&#xff09;也叫装袋法&#xff0c;其思想是通过将许多相互独立的学习器的结果进行结合&#xff0c;从而提高整体学习器的泛化能力&#xff0c;是一种并行集成学习方法。 工作流…

计算机msvcp120.dll丢失?msvcp120.dll丢失5种简单的解决方法分享

你们是否在电脑操作过程中常看到一段类似“msvcp120.dll缺失或损坏”的报错信息&#xff1f;这可能会干扰大家的日常应用程序使用&#xff0c;怎么办呢&#xff1f;别担心&#xff0c;接下来就是一篇详细的步骤来教你如何应对这种情况&#xff0c;让你们的电脑运作如初&#xf…

Cadence virtuoso drc lvs pex 无法输入

问题描述&#xff1a;在PEX中的PEX options中 Ground node name 无法输入内容。 在save runset的时候也出现无法输入名称的情况 解决办法&#xff1a; copy一个.bashrc文件到自己的工作目录下 打开.bashrc文件 在.bashrc中加一行代码&#xff1a;unset XMODIFIERS 在终端sour…

无需API开发,伯俊科技实现电商与客服系统的无缝集成

伯俊科技的无代码开发实现系统连接 自1999年成立以来&#xff0c;伯俊科技一直致力于为企业提供全渠道一盘货的服务。凭借其24年的深耕零售行业的经验&#xff0c;伯俊科技推出了一种无需API开发的方法&#xff0c;实现电商系统和客服系统的连接与集成。这种无代码开发的方式不…

【Proteus仿真】【STM32单片机】防火防盗GSM智能家居设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用声光报警模块、LCD1602显示模块、DS18B20温度、烟雾传感器模块、按键模块、PCF8591 ADC模块、红外检测模块等。 主要功能&#xff1a; 系统运行…

Linux--初识和几个简单的指令(1)

目录 前言 0.什么是操作系统 0.1 搭建 Linux 环境 0.2搭建 Linux 环境小结 1.使用 XShell 远程登录 Linux 1.1关于 Linux 桌面 1.2下载安装 XShell 1.3查看 Linux 主机 ip 1.4XShell 下的复制粘贴 2.Linux下基本指令 2.1 pwd命令 2.2 ls命令 2.3 mkdir指令 2.4 cd…

vue2项目封装axios(vite打包)

1.安装 npm i axios 2.封装axios 说明&#xff1a;request.js文件 //对axios进行二次封装 import axios from "axios" import "nprogress/nprogress.css"// 当前模块中引入store // import store from "/store"// 引入进度条import nprogress f…

【C++】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 )

文章目录 一、类模板1、类模板引入2、声明类模板语法3、调用类模板语法 二、代码示例 - 类模板1、代码示例2、执行结果 一、类模板 1、类模板引入 类模板 与 函数模板 的 作用类似 , 当 多个类 功能相同 , 只是数据类型不同 , 此时可以 定义一个类模板 代替 定义多个类 ; 借助…

Python (十) 元组

元组 元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号 ( )&#xff0c;列表使用方括号 [ ]。 元组创建只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 访问 tup1 (hello,Java,Python,123,456) print(type(tup1)) print(tup1[1])#输出 …

微信个人号api

简要描述&#xff1a; 登录E云平台 请求URL&#xff1a; http://域名地址/member/login域名地址开发者账号密码:后台系统自助开通 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/json 参数&#xff1a; 参数名必选类型说…

F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F

Problem - F - Codeforces 题目大意&#xff1a;有q次询问&#xff0c;每次询问给出一个数x&#xff0c;要求构造一棵n个点的树&#xff0c;使得对于每次询问&#xff0c;树上都有一条简单路径的长度等于x&#xff0c;同时每次询问前可以对树进行一次操作&#xff0c;即将一个…

ForkLift:macOS文件管理器/FTP客户端

ForkLift 是一款macOS下双窗口的文件管理器&#xff0c;可以代替本地的访达。ForkLift同时具备连接Ftp、SFtp、WebDav以及云服务器。 ForkLift还具备访达不具备的小功能&#xff0c;比如从文件夹位置打开终端&#xff0c;显示隐藏文件&#xff0c;制作替换等功能。ForkLift 是一…
最新文章