数据结构第六章——图

2023-11-16

数据结构第六章——图

图的定义和术语

G = (V, E)

V:顶点(数据元素的)有穷非空集合;

E:边的有穷集合。

无向图:每条边都是无方向的。

有向图:每条边都是有方向的。

完全图:任意两个顶点都有一条边两连

请添加图片描述

无向完全图:n个顶点 n(n-1)/2条边

有向完全图:n个顶点 n(n-1)条边

稀疏图:有很少边或弧地的图

稠密图:有较多的边或弧的图

:边/弧带权的图

邻接:有边/弧相连的两个顶点之间的关系

关联(依附):边/弧与顶点之间的关系

顶点的度:与该顶点相关联的边的数目,记为TD(v)

在有向图中,顶点的度等于该顶点的入度和出度之和。

顶点v的入度是以b为终点的有向边的条数,记为ID(v)

顶点的出度是以v为始点的有向边的条数,记作OD(v)

路径:接续的边构成的顶点序列

路径长度:路径上边或弧的数目/权值之和。

第一个顶点和最后一个顶点相同的路径。

简单路径:除路径起点和终点可以相同外,其余顶点均不相同的路径。

简单回路(简单环):除路径起点和终点相同外,其余顶点均不相同的路径。

连通图(强连通图):在无(有)向图G=(V,{E})中,若对任何两个顶点v,u都存在从v到u的路径,则称G是连通图(强连通图)。

权与网:图中边或弧所具有的相关数称为权。标明从一个顶点到另一个定点的距离或耗费。

带权的图称为网。

子网:设有两个图G = (V,{E})、G1 = (V1,{E1}),若V1∈V, E1∈E,则称G1是G的子图。

例如:(b)(c)是(a)的子图
在这里插入图片描述

连通分量(强连通分量):无向图的极大连通子图称为G的连通分量

极大连通子图的意思是:该子图是G连通子图,将G的任何不在孩子图中的顶点加入,子图不再连通。

有向图G的极大强连通子图称为G的强连通分量。

极大强连通子图意思是:该子图是G的强连通子图,将D的任何不在该子图中的顶点加入,子图不再是强连通。

极小连通子图:该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通

生成树:包含无向图G所有顶点的极小连通子图。

生成森林:对非连通图,由各个连通分量的生成树的集合

邻接矩阵

数组(邻接矩阵)表示法

建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)

无向图的邻接矩阵是对称的

顶点i的度 = 第i行(列)中1的个数

有向图的邻接矩阵中:

第i行含义:以结点vi为尾的弧(即出度边)

第i列含义:以结点vi为头的弧(即入度边)

顶点的出度= 第i行元素之和。

顶点的入度=第i列元素之和

有向图的邻接矩阵可能是不对称的。

邻接矩阵的存储表示:用两个数组分别存储顶点表和邻接矩阵

#define MaxInt 222222(一个很大的数)
#define MVNum 100//最大顶点数
typedef char VerTexType;
typedef struct{
	VerTextType vexs[MVNum];//顶点表
	ArcType arcs[MVNum][MVNum];//邻接矩阵
	int vexnum. arcnum;//图的当前点数和边数
}AMGraph

采用邻接矩阵表示法创建无向图

算法思想:

  1. 输入总定点数和总边数
  2. 依次输入点的信息存入顶点表中
  3. 初始化邻接矩阵,使每个权值初始化为极大值
  4. 构造邻接矩阵
Status CreateUDN(AMGraph &G){
//采用邻接矩阵表示法,创建无向网G
	cin >> G.vexnum >> arcnum;//输入顶点数和总边数
	for(int i = 0; i < G.vexnum;++i)
		cin >> G.vexs[i];
	for(int i = 0; i < G.vexnum; ++i)
		for(int j = 0; j < G.vexnum; ++j)
			G.arcs[i][j] = MaxInt;//边的权值置为最大值
		for(int k = 0; k < G.arcnum;++k)
			cin >> v1 >> v2 >> w;//输入一条边所依附的顶点及边的权值
			i = LocateVex(G, v1);
			j = LocateVex(G, v2);//确定v1和v2在G中的位置
			G.arcs[i][j] = w;//边<v1,v2>的权值置为w
			G.arcs[j][i] = G.arcs[i][j];//置<v1, v2>的对称边<v2, v1>的权值为w
	return OK
}
int LocateVex(AMGraph G, VertexType u){
	//图G种查找顶点u,存在则返回顶点表中的下标,否则返回-1
	int i;
	for(i = 0; i < G.vexnum; i++)
		if(u == G.vexs[i]) return i
	return -1;
}

图的邻接表存储表示

typedef struct VNode{
	VerTextType data;//顶点信息
	ArcNode * firsarc;//指向第一条依附该顶点的边的指针
}VNode, AdjList[MVNum];//AdjList表示邻接表类型
//弧(边)的结点结构
#define MVNum 100//最大顶点数
typedef struct ArcNode{	//边结点
	int adjvex;//改变所指向的顶点的位置
	strcut ArcNode * nextarc;//指向下一条边的指针
	OtherInfo info;//和边相关的信息
}ArcNode;
//图结构的定义
typedef struct{
	AdjList vertices;
	int vexnum, arcnum;//图的当前顶点数和弧数
}ALGraph;
ALGragh G;//定义了邻接表表示的图G
G.vernum = 6, G.arcnum = 6//图G之包含5个顶点。5条边
G.vertices[1].data = 'b'//图G中的第2个顶点是b
p = G.vertices[1].firstarc;//指针p指向顶点b的第一条边结点
p->adjvex = 4;//p指针所指边结点时到下标4的结点的边

采用邻接表表示法创建无向图

算法思想

  1. 输入总顶点和总边数
  2. 建立顶点表
    一次输入点的信息存入顶点表中,使每个表头结点的指针域初始化为NULL
  3. 创建邻接表
    一次输入每条边所依附的两个顶点,确定两个顶点的序号i和j,建立边结点,将此边结点分别插入到vi和vj对应的两个边链表的头部
Status CreateUDG(ALGraph &G){//采用邻接表表示法,创建无向图G
	cin >> G.vexnum >> G.arcnum;//输入总顶点数,总边数
	for(int i = 0; i < G.vexnum;++i){//输入各点,构造表头结点表
		cin >> G.vertices[i].data;//输入顶点值
		G.vertices[i].firstarc = NULL;//初始化表头结点的指针域
	}
	for(int k = 0; k < G.arcnum; ++k)//输入各边,构造邻接表
	{
		cin >> v1 >> v2;//输入一条边依附的两个顶点
		i = LocateVex(G, v1);
		j = LocateVex(G, v2);
		p1 = new ArcNode;//生成一个新的边结点*p1
		p1 -> adjvex = j;//邻接点序号为j
		p1 -> nextarc = G.vertices[i].firstarc;
		G.vertices[i].firstarc = p1;//将新结点*p1插入顶点vi的边表头部
		p2 = new ArcNode;//生成另一个对称的新的边结点p2
		p2 -> adjvex = i;
		p2 -> nextarc = G.vertices[j].firstarc;
		G.vertices[j].first = p2;//将新结点*p2插入顶点vj的边表头部
	}
	return OK;
}

邻接矩阵与邻接表表示法的区别:

  1. 对于任意确定的无向图,邻接矩阵你是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)
  2. 邻接矩阵的空间复杂度为O(n^2),而邻接表的空间复杂度为O(n+e)

用途:邻接矩阵多用于稠密图,而邻接表多用于稀疏图

十字链表是有向图的另一种链式存储结构,我们可也可以把它看成是将有向图的链接表和逆邻接表结合起来形成的一种链表

有向图中的每一条胡对应十字链表中的一个弧结点,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点

图的遍历

遍历定义:从已给的连通图中某一顶点触发,沿着一些边访图中所有的顶点,且使乜咯顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。

遍历的实质:找每个顶点的邻接点的过程。

图的特点:图中可能存在回路,且图的任一顶点都看与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。

图常用的遍历:

  1. 深度优先搜索遍历DFS(一条道走到黑)
  2. 广度优先遍历BFS

深度优先遍历(DFS)

  1. 在访问图中某一起始顶点v后,由v触发,访问它的任意邻接顶点w1
  2. 再从w1出发,访问与w1邻接但未被访问过的顶点w2
  3. 然后再从w2出发,进行类似的访问
  4. 如此进行下午,直到到达所有的邻接顶点都被访问过的顶点u为止
  5. 接着,退回异步,推导前一次刚访问过的顶点,看看是否还有其它没被访问的邻接顶点
  6. 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问
  7. 如果没有,就再退回一步进行搜索,重复上述过程,知道连通图汇总所有顶点都被访问过为止

深度优先搜索遍历算法的实现

邻接矩阵表示的无向图深度优先遍历实现:

void DFS(AMGraph G, int v){//图G为邻接矩阵类型
	cout << v;//访问第v个顶点
	visited[v] = true;
	for(int w = 0; w < G.vexnum; w++)//依次检查邻接矩阵v所在的行
	{
		if(G.arcs[v][w] != 0 && (!visited[w]))
			DFS(G,w);//w是v的邻接点,如果w未访问,则递归调用DFS
	}
}

DFS算法效率分析

用邻接矩阵来表示图,遍历图中每一个顶点都要从头扫描该顶点所在行,时间复杂度为O(n^2)

用邻接表来表示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)

结论:稠密图适用于在邻接矩阵上进行深度遍历。稀疏图时域在邻接表上进行深度遍历

广度优先搜索(BFS)

方法:从图的某一结点出发,首先一次访问该结点的所有邻接点vi1,vi2,……vin,再按这些顶点被访问的先后次序依次访问与他们相邻接的所有违背访问的顶点。重复此过程,纸质所有顶点被访问为止。

按广度优先非递归遍历连通图G
void BFS(Graph G, int v){
	cout << v; visited[v] = true;//访问第v分顶点
	InitQueue(Q);//辅助队列Q初始化,置空
	EnQueue(Q,v);//v进队
	while(!QueueEmpty(Q)){//队列非空
		DeQueue(Q, u);//队头元素出队并置为u
		for(w = FirstAdjVex(G,u); w >= 0; w = NextAdjVex(G, u, w))
		if(!visited[w])//w为u的尚未访问的邻接顶点
			cout << w;
			visited[w] = true;
			EnQueue(Q,w);//进队
		}
		
	}
}

BFS算法效率分析

  1. 如果使用邻接矩阵,则BFS对于每一个被访问到的顶点都要循环检测矩阵中的整整一行(n个元素),总代价为O(n^2)
  2. 用邻接表来标示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n + e)。

生成树:所有的顶点均有边连接在一起,但不存在回路的图

一个图可以有许多棵不同的生成树

所有的生成树具有以下共同特点

  • 生成树的顶点个数与图的顶点个数相同
  • 生成树是图的极小连通子图,去掉一条边则非连通
  • 一个有n个顶点的连通图的生成树有n-1条边
  • 在生成树中再加一条边必然形成回路
  • 生成树中任意两个顶点间的路径是唯一的

一个图中可以有许多不同的生成树。

含有n个顶点n-1条边的图不一定是生成树。

最小生成树:给定一个无向网络,在该网的所有生成树中,使得各边权值之和最小的那棵生成树称为该网的最小生成树。也称最小代价生成树。

构造最小生成树

构造最小生成树的算法很多,其中多数算法都利用了MST性质

MST性质:设N = (V,E)是一个连通网,U是顶点集V的一个非空子集。若边(u,v)s是一条具有最小权值的边,其中u∈U,v属于V-U,则必存在一棵包含(u,v)的最小生成树。

MST性质解释

在生成树的构造过程中,图中n个顶点分属两个集合:

已落在生成树上的顶点集:U

尚未若在生成树上的顶点集V-U

接下来则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。

算法思想:

  • 设N = (V,E)是连通网,TE是N上最小生成树中边的集合
  • 初始令U = {u0},{u0∈V},TE={}
  • 在所有u∈U,v∈V-U的边(u,v)∈E中,找一条代价最小的边(u0,v0)
  • 将(u0,v0)并入集合TE,同时v0并入U0
  • 重复上述操作直至U=V为止,则T = (V,TE)为N的最小生成树。

构造最小生成树方法二:克鲁斯卡尔(kruskal)算法

算法思想:

  • 设连通网N = (V,E),令最小生成树初始状态为只有n个顶点儿无边的非连通图T=(V,{}),每个顶点自成一个连通分量
  • 在E中选取代价最小的边,若该边衣服的顶点落在T中不同的连通分量上(即:不能形成环),则将此边加入到T中,否则,舍去此边,选取下一条代价最小的边
  • 依次类推,直到T中所有顶点都在同一连通分量上为止

最短路径:

问题抽象:在有向网中A点(源点)到达B点(终点)的多条路径,寻找一条各边权值之和最小的路径,即最短路径。

最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n-1条边。

两种常见的最短路径问题:

  1. 单源最短路径——用Dijkstra(迪杰斯特拉)算法
  2. 所有顶点间的最短路径——用Floyd(弗洛伊德)算法

Dijstra算法

  1. 初始化:先找出从源点v0到各终点vk顶点直达路径(v0,vk),即通过一条弧到达的路径
  2. 选择:从这些路径中找出一条长度最短的路径
  3. 更新:然后对其余各路进行适当调整。

Floyed算法

  • 逐个顶点试探
  • 从vi到vj的所有可能存在的路径中
  • 选出一条长度最短的路径

步骤:

  1. 初始时设置一个n阶方阵,对齐对角线元素设置为0,若存在弧<vi,vj>,则对应元素为权值,否则为∞
  2. 逐步试着在原直接路径中增加中间顶点,若加入中间顶点庵后路径变短,则修改之,否则,位置原值。所有顶点试探完毕,算法结束。

有向无环图:无环的 有向图,简称DAG图

AOV网:用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网简称AOV网

AOE网:用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,称为AOE网

AOV网的特点:

  • 若从i到j有一条有向路径,则i是j的前驱,j是i的后继
  • 若<i,j>是网中有向边,则i是j的直接前驱,j是i的直接后继
  • AOV网中不允许有活动,因为如果有回路存在,则标明某项活动以自己为先决条件,显然这是荒谬的

拓扑排序

在AOV网没有回回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧<i,j>存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序。

拓扑排序的方法:

  • 在有向体育中选一个没有前驱的顶点且输出之。
  • 从有向图中删除该顶点和所有以它为尾的弧
  • 重复上述步骤,直至全部顶点均已输出或者当图中不存在无前驱的顶点为止。

一个AOV网的拓扑序列不是唯一的。

检测AOV网中是否存在环方法:对该有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环

关键路径

把工程计划表示为边表示活动的网络,即AOE网,同顶底表示事件,弧表示活动,弧的权表示活动持续时间

事件表示在他之前的活动已经完成,在它之后的活动可以开始。

关键路径——路径长度最长的路径

路径长度——路径上各活动持续时间之和

列,使得若AOV网中有弧<i,j>存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性序列称为拓扑有序序列,相应的拓扑有序排序的算法称为拓扑排序。

拓扑排序的方法:

  • 在有向体育中选一个没有前驱的顶点且输出之。
  • 从有向图中删除该顶点和所有以它为尾的弧
  • 重复上述步骤,直至全部顶点均已输出或者当图中不存在无前驱的顶点为止。

一个AOV网的拓扑序列不是唯一的。

检测AOV网中是否存在环方法:对该有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环

关键路径

把工程计划表示为边表示活动的网络,即AOE网,同顶底表示事件,弧表示活动,弧的权表示活动持续时间

事件表示在他之前的活动已经完成,在它之后的活动可以开始。

关键路径——路径长度最长的路径

路径长度——路径上各活动持续时间之和

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构第六章——图 的相关文章

  • 【数据结构/C++】树和二叉树_二叉链表

    include
  • D (1173) : A DS二叉树_合并二叉树

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 给定两个二叉树 输出这两个二叉树合并后形成的二叉树 依次输出前序遍历 中序遍历 后序遍历 二 输入与输出 1 输入 第一行输入t 表示有t个测试样例 第
  • E (1052) : DS树--带权路径和

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 计算一棵二叉树的带权路径总和 即求赫夫曼树的带权路径和 已知一棵二叉树的叶子权值 该二叉树的带权路径和APL等于叶子权值乘以根节点到叶子的分支数 然后求
  • 数组实现循环队列(增设队列大小size)

    目录 一 前言 1 如何实现循环 2 如何判断队列为空 3 如何判断队列为满 二 循环队列的结构定义 三 循环队列的创建及其初始化 四 入队 五 出队 六 取队头元素 七 取队尾元素 八 循环队列判空 九 循环队列判满 十 循环队列销毁 一
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • 八大排序(希尔排序)

    上篇文章我们来看了看插入排序是怎么实现的 本章内容就是在插入排序的基础上完成希尔排序 希尔排序是一个比较强大的排序 我们希尔排序的时间复杂度是比较难算的 这里直接给出的结论就是时间复杂度就是O N 1 3 比较难算的原因就是我们每一次的次数
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • List去重-使用distinctByKey方法根据对象的属性进行去重

    description 使用distinctByKey方法根据对象的属性进行去重 author zs date 2023 12 18 14 29 param keyExtractor return java util function Pr
  • 【数据结构和算法】 K 和数对的最大数目

    其他系列文章导航 Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一 题目描述 二 题解 2 1 方法一 双指针排序 三 代码 3 1 方法一 双指针排序 3
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    416 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 使得两个子集的元素和相等 示例 1 输入 nums 1 5 11 5 输出 true 解释
  • 回溯算法第零篇【递归、搜索与回溯】【回溯算法入门必看】

    本篇文章的目的 1 给小伙伴们对回溯算法中的名词进行解释 2 消除递归的恐惧 回溯是递归的一个分支 给小伙伴们一个建议 整篇文章都要看完 一字不漏 全是干货 注意 分析回溯的思想之前 我们得知道一个关系 递归包含搜索 搜索包含回溯 所以我们
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 数据结构学习笔记(七)搜索结构

    文章目录 1 前言 2 概念 3 静态搜索结构 3 1 静态搜索表 3 2 顺序搜索表 3 2 1 基于有序顺序表和顺序搜索和折半搜索 4 二叉搜索树
  • LeetCode 2397. 被列覆盖的最多行数,状态压缩优化回溯法

    一 题目 1 题目描述 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆盖 则认为这
  • 搜索二叉树(BSTree)

    一 搜索二叉树的概念 二叉搜索树又称为做二叉排序树 二叉查找树 其要么是一棵空树 要么是一个满足以下性质的二叉树 若它的左子树不空 则左子树上所有结点的关键字均小于根结点关键字 若它的右子树不空 则右子树上所有结点的关键字均大于根结点关键字
  • 带头双向循环链表基础

    带头双向循环链表基础 销毁 销毁 void ListDestory ListNode phead void ListDestory ListNode phead assert phead ListNode cur phead gt next
  • 数据结构——排序

    前言 哈喽小伙伴们好久不见 也是顺利的考完试迎来了寒假 众所周知 不怕同学是学霸 就怕学霸放寒假 假期身为弯道超车的最佳时间 我们定然是不能懒散的度过 今天我们就一起来学习数据结构初阶的终章 七大排序 本文所有的排序演示都为升序排序 目录

随机推荐

  • POI实现word转HTML!呵呵!!!

    那些说POI把word转HTML如何如何完美的人们 copy东copy西 有想过转出来的格式与word不一致么 唉
  • 动态规划法--求数组中最大子集合的和

    例题 给定一个数组int a 9 1 3 5 1 7 5 3 1 计算数组中连续的最大和以及出现的位置 输出 下标1到5位连续的最大和为15 首先看到这种题目 我的第一反应 就是用冒泡排序的思想去做 public class zuoye p
  • A*自动寻路算法—java版(八方向版)

    上一篇博客分享了Java版的自动寻路 但是只是上下左右四个方向的 今天把八方向的也分享出来 既然四方向的已经成功了 那么改进成八方向的 只要注意两个地方就可以了 一个是获取四周方块的时候 一个是移动的时候 一 获取四周方块 在autofin
  • Centos 配置yum 的几种方式、

    一 yum 的 基础运用 1 命令形式 yum option command package 选项 option h 帮助 y 直接安装的意思yes q 不显示安装的过程 其他的可以通过 yum h 查看 同样 command 也通过 yu
  • 机器学习之基于LDA的人脸识别

    目录 LDA降维 思想 matlab代码 fisherface 思想 matlab代码 人脸识别 思想 matlab代码 LDA降维 思想 首先 代码通过使用dir函数获取指定路径下所有以 bmp 结尾的文件 并存储在变量pictures中
  • idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题

    如果这篇文章能帮到大家 并且你也想了解程序员的 副业 请关注博主的微信公众号 程序员副业笔记 因为maven私服挂了 无法下载jar包 通过阿里云公共仓库下载的jar 然后放入本地仓库后 还是无法引用 打包报错 百度了一下问题的解决办法 因
  • 思考:开源软件的开发过程,以及商业使用 (*****)

    明确软件的具体用途 功能 以及迭代的各种边界 如果不将所需的软件进行集合化 那么 像 github 中的软件那样 自己去搜索 筛选 测试等等 这是一件很耗费时间和精力的事情 编写和筛选各种所需的库 或其他 优先筛选已有的 现成的开源库 以及
  • 数据库连接池实现原理

    数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接 并对外暴露数据库连接获取和返回方法 如 外部使用者可通过getConnection 方法获取连接 使用完毕后再通过releaseConnection 方法将连接返回 注意此时连
  • uniapp中uni.onTabBarMidButtonTap页面跳转注意事项

    uniapp开发中 如果需要实现底部导航中间按钮 需要监听uni onTabBarMidButtonTap 但是如果要在该事件回调函数中实现页面跳转 url必须以 开头 即如下 否则无法实现页面跳转 搞了2个小时才发现 特此记录 避免以后再
  • 华为华三思科 交换机基础配置一览

    console密码修改 华为 user interface console 0 authentication mode password set authentication password cipher XXXXXXXXX 华三 lin
  • 图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作

    大家看这篇博文前可以先看一看下面这篇博文 下面这篇博文是这篇博文的基础 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程 并利用OpenCV的函数erode 和函数dilate 对图像进行腐蚀和膨胀操作 图像形态学腐蚀可以将细小的噪声区
  • android看本地视频播放器下载,Android平台上5款最好的本地视频播放软件

    5 看本地视频随着新技术的快速发展 网络机顶盒的分辨率已经达到了4k级别 不仅可以播放1080p全高清影片 也能观看3d原盘 以及4k超高清影片 但需要连接u盘或者其他移动存储设备 随着人们对影视娱乐高清晰 高音效的追求 以及现代家庭对大屏
  • 无法载入增效工具_AfterEffects错误:关于E3D插件无法加载增效工具“Element.aex”。(126)(48::46)...

    大家好 关于E3D报错的问题 相信是很多人在使用AE进行创作和套模板时遇到的一块心病 虽然报错 但是依然不舍得放弃 可还是很难得到解决 那么接下来我给同学们总结一下关于E3D报错的解决途径和步骤 AE报错 could not be load
  • React入门——3.元素渲染

    本节内容为对元素渲染 React的整理归纳 如果你直接阅读此React官方文档较为吃力 可以对照本节与React文档中的相应章节作为解释 也许会加快你的阅读理解速度 const element h1 Hello World h1 这是一个很
  • less(二) less的变量和注释

    上篇中 我们简单了解了less的使用环境和怎么使用less 下面我们了解一下less 的变量和注释 less 的注释 这是第一种注释 这是第二种注释 上面的第一种注释麻烦一点 但是当我们的less文件编译成css文件后 css文件中注释依然
  • Mac 安装openssl

    1 安装openssl brew install openssl 1 1 2 修改环境变量 export PATH usr local opt openssl 1 1 bin PATH 3 创建软链接 cd usr local includ
  • es统计所有数量的坑

    最近在统计线上的数量时 会发现始终都是10000 觉得很奇怪 先来说一下场景 我使用的是7 2版本的es 需要统计所有数量 后来发现数量下面有个relation gte的属性 然后在网上一搜 发现es 7 X在数据量很大时 数量都会是100
  • Linux Ubuntu安装RabbitMQ服务

    文章目录 前言 1 安装erlang 语言 2 安装rabbitMQ 3 内网穿透 3 1 安装cpolar内网穿透 支持一键自动安装脚本 3 2 创建HTTP隧道 4 公网远程连接 5 固定公网TCP地址 5 1 保留一个固定的公网TCP
  • burpsuit to run burp suite using java 17+

    根据报错提示 在命令行运行时后面加上这句代码 add opens java desktop javax swing ALL UNNAMED add opens java base java lang ALL UNNAMED 即 javaw
  • 数据结构第六章——图

    数据结构第六章 图 图的定义和术语 G V E V 顶点 数据元素的 有穷非空集合 E 边的有穷集合 无向图 每条边都是无方向的 有向图 每条边都是有方向的 完全图 任意两个顶点都有一条边两连 无向完全图 n个顶点 n n 1 2条边 有向