【数据结构】图论(图的储存方式,图的遍历算法DFS和BFS、图的遍历算法的应用、图的连通性问题)

news2025/1/15 19:52:53

目录

  • 图论
    • 一、 图的基本概念和术语
    • 二、图的存储结构
      • 1. 数组(邻接矩阵)存储表示
        • 无向图的数组(邻接矩阵)存储表示
        • 有向图的数组(邻接矩阵)存储表示
      • 邻接表存储表示
      • 有向图的十字链表存储表示
      • 无向图的邻接多重表存储表示
    • 三、图的遍历算法
      • 图的遍历——深度优先搜索(DFS)
      • 图的遍历——广度优先搜索(BFS)
    • 四、图的遍历算法的应用(无向图)
    • 五、图的连通性问题
      • 生成树
      • Prim算法
      • Kruskal 算法

图论

一、 图的基本概念和术语

网状结构,逻辑关系多对多

  1. :图G由集合V和E组成,记为G=(V,E)。图中的结点称为顶点,V(G)是顶点的非空有穷集;相关的顶点偶对称为边,E(G)是边的有穷集。

图分为有向图、无向图

  1. 有向图(Digraph)——V(G)是顶点的非空有限集;E(G)是有向边(即弧)的有限集合,弧是顶点的有序对,记<v, w>,v为弧尾(Tail),w为弧头(Head)
  2. 无向图(Undigraph)——V(G)是顶点的非空有限集;E(G)是边的有限集合,边是顶点的无序对,记(v, w)或(w, v),并且(v, w)=(w, v).
    在这里插入图片描述
  1. 顶点:表示数据元素

  2. :表示数据元素之间的逻辑关系,分为有向边(顶点的有序对)和无向边(顶点的无序对)

  3. :边带权的无向图称作无向网;弧带权的有向图称作有向网。

  4. 完全图:n个顶点的含有 n(n-1)/2 条边的无向图称作完全图;n个顶点的含有 e=n(n-1) 条弧的有向图称作 有向完全图.
    若边或弧的个数 e<nlogn,则称作稀疏图,否则称作稠密图。

  5. 邻接点、关联:假若顶点v 和顶点w 之间存在一条边,则称顶点v 和w 互为邻接点,边(v,w)和顶点v 和w相关联

  6. :无向图中和顶点v 关联的边的数目定义为v的度,记为TD(v)
    有向图顶点的度分为入度出度
    入度:有向图中以顶点v为弧头的弧的数目称为顶点v的入度,记为ID(v)
    出度:有向图中以顶点v为弧尾的弧的数目称为顶点v的出
    度,记为OD(v)

  7. 路径、路径长度:设无向图G=(V,E)中的一个顶点序列 u = v i , 0 , v i , 1 , … , v i , m = w { u=v_i,₀,v_i,₁, …, v_i, m=w} u=vi,0,vi,1,,vi,m=w中,若 ( v i , j − 1 , v i , j ) ∈ E , 1 ≤ j ≤ m (v_{i, j-1},v_{i, j})∈E,1 ≤ j ≤ m (vi,j1,vi,j)E1jm,则称从顶点u 到顶点w 之间存在一条路径;路径上边的数目称作路径长度
    简单路径:序列中顶点不重复出现的路径
    简单回路:序列中第一个顶点和最后一个顶点相同的路径

  8. 连通图:若无向图G中任意两个顶点之间都有路径相通,则称此图为连通图。

  9. 连通分量:若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量。

在这里插入图片描述

  1. 强连通图:有向图中若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图。否则,其各个极大强连通子图称作它的强连通分量。
    在这里插入图片描述

  2. 生成树:假设一个连通图有 n 个顶点和 e 条边,其中 n-1 条边和 n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。

  3. 生成森林:对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。
    在这里插入图片描述

  4. 有向树:如果一个有向图恰有1个顶点的入度为0,其余的顶点入度均为1,则称该图为一棵有向树

  1. 对于非强连通图的一个强连通分量:包含其全部n个顶点、n-1条弧、且只有1个顶点的入度为0、其余的顶点入度均为1的子图称为该连通分量的有生成向树.
  2. 对于非强连通图的所有强连通分量的有向生成树构成该有向图的生成森林.
  3. 一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧.

二、图的存储结构

■ 图的存储表示(非顺序存储映像):

  1. 图的数组(邻接矩阵)存储表示
  2. 图的邻接表存储表示
  3. 有向图的十字链表存储表示
  4. 无向图的邻接多重表存储表示

■ 设计图的存储表示,应考虑方便以下操作:
• 求入度,出度
• 求邻接顶点
• 判断顶点之间是否有边相连

1. 数组(邻接矩阵)存储表示

无向图的数组(邻接矩阵)存储表示

■ n个顶点的图用2个数组存放:二维数组( n ∗ n n*n nn的矩阵)存放顶点之间的逻辑关系(图中的边、弧),一维数组存放顶点信息(数据元素的
■ 设无向图 G = ( V , E ) G=(V,E) G=(V,E),A[i][j]表示顶点 v i v_i vi v j v_j vj之间是否存在连边
在这里插入图片描述
可以利用对称阵的压缩存储方法存储

无向图顶点 v i v_i vi的度
在这里插入图片描述

有向图的数组(邻接矩阵)存储表示

设有向图 G = ( V , E ) G=(V,E) G=(V,E), A[i][j]表示是否存在顶点 v i v_i vi流向顶点 v j v_j vj的弧.
在这里插入图片描述

有向图邻接矩阵不一定是对称阵
在这里插入图片描述

无向网的邻接矩阵 w i j w_{ij} wij表示在顶点 v i v_i vi v j v_j vj的连边上的权值。 在这里插入图片描述
有时:也用 ∞ ∞ 代表没有边

有向网的邻接矩阵 w i j w_{ij} wij表示在顶点 v i v_i vi流向顶点 v j v_j vj的弧上的权值. 在这里插入图片描述

#define MAXSIZE 100
typedef struct {
	VertexType    vexs[MAXSIZE]; //一维数组存放顶点信息 
	int  arcs[MAXSIZE][MAXSIZE];//邻接矩阵
	int  vexnum, arcnum; //顶点数和边数
	int kind; //图的类型:有向图还是无向图
} MGraph;
MGraph T;

在这里插入图片描述

邻接表存储表示

无向图的邻接表:为顶点vi所建的单链表是将与顶点vi相关联 的边建成一个单链表;或者说:将顶点vi的邻接点建成一个单链表。

■ 图的一种链式存储结构,对图中每个顶点建立一个单链表,为顶
v i v_i vi所建的单链表是将与顶点 v i v_i vi相关联的边或弧建成一个单链表。
■ 用一维数组存放每个顶点的信息和相应单链表的头指针。
■ 每个数组元素存放图中一个顶点:顶点的数据(data)和为其所建单链表的头指针(firstarc)。

在这里插入图片描述

为便于维护数据的一致性,通常单链表中只要给出邻接点的存放位置----在一维数组中对应数组元素的下标即可

存的边数是2e个 ,也就是每个弧存了2次
在这里插入图片描述
有向图的邻接表:第i个单链表(为 v i v_i vi所建单链表)中的结点是从顶点 v i v_i vi流出的弧流向的顶点
顶点vi的出度是第i个单链表中含有的数据元素的个数,即为vi所建单链表的长度。
在有向图的邻接表中不易找到指向该顶点的弧。
在这里插入图片描述

typedef struct ArcNode {
	int vex;  // 该弧所指向的顶点的位置 
	struct ArcNode *link; // 指向下一条弧的指针 
	InfoType  *info;  // 该弧相关信息的指针
}ArcNode;//单链表节点类型

typedef struct VNode {
	int data; // 顶点信息
	ArcNode *firstarc; // 指向第一条依附该顶点的弧
}VNode;//数组元素类型

typedef struct {
	VNode  arc[MAXSIZE]; 
	int   vexnum, arcnum;
	int  kind; //表示有向图还是无向图
}Graphs;

逆向:
有向图的逆邻接表中,为顶点vi建的单链表示流向该顶点的弧
在这里插入图片描述
在这里插入图片描述

网的邻接表表示
在这里插入图片描述

有向图的十字链表存储表示

每个顶点建2个单链表:流出去的弧建一个单链表,流入的弧建一个单链表。
在这里插入图片描述

typedef structArcBox { // 弧的结构表示
	int tailvex, headvex; 
	InfoType *info;//注意定义的类型
	struct ArcBox *hlink,*tlink;
}ArcBox;

typedef structVexNode { // 顶点的结构表示
	int data;
	ArcBox *firstin,*firstout;
}VexNode;

typedef struct {
	VexNode xlist[MAXSIZE]; // 顶点信息
	int vexnum, arcnum; //有向图的当前顶点数和弧数
}OLGraph;

在这里插入图片描述

无向图的邻接多重表存储表示

在这里插入图片描述

边的结构表示

typedef struct Ebox {
	int   mark;
	int   ivex, jvex;
	struct EBox *ilink, *jlink;
} EBox;

三、图的遍历算法

图的遍历:从图中某个顶点出发访遍图中其余顶
点,并且使图中的每个顶点仅被访问一次的过程

遍历应用举例:

  • 判断图的连通性、
  • 求等价类等
  • 求连通分量
  • 求路径相通

深度优先搜索广度优先搜索

图的遍历——深度优先搜索(DFS)

  1. 图的存储——邻接矩阵和邻接表均可以
  2. 判别图中的顶点v的邻接点是否被访问的方法:
    ⮚ 解决的办法:为每个顶点设立一个“访问标志”,设一维数组visited[ ]
    ① visited[v]=1表示顶点v已经被访问
    ② visited[v]=0表示顶点v尚未被访问
    ③ 初始化时,所有顶点均为未被访问
  • 深度优先搜索生成树:访问时经过的顶点和边构成 的子图
  • 深度优先搜索生成森林:若选用多个出发点做深度优先搜索,会产生多棵深度优先搜索生成树—构成深度优先搜索生成森林.

深度优先搜索遍历连通图的过程类似于树的先根遍历`

深度优先搜索应用
判断无向图是否连通?
若从无向图中任一点出发能访问到图中所
有顶点,则该图为连通图
判断有向图是否强连通?
若从有向图中每一点出发能访问到图中所有顶点,则该图为强连通图.

实现方法:
邻接表为例实现图的深度优先搜索
存储结构为:

typedef struct ArcNode {
	int vex;  // 该弧所指向的顶点的位置 
	struct ArcNode *link; // 指向下一条弧的指针 
	InfoType  *info;  // 该弧相关信息的指针
} ArcNode;//单链表节点类型

typedef struct VNode {
	int data; // 顶点信息
	ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode;//数组元素类型

typedef struct {
	VNode  arc[MAXSIZE]; 
	int   vexnum, arcnum;
	int  kind; //表示有向图还是无向图
} Graphs;

DFS实现流程图以及代码:
在这里插入图片描述

typedef struct ArcNode {
	int vex;  // 该弧所指向的顶点的位置 
	struct ArcNode *link; // 指向下一条弧的指针 
	InfoType  *info;  // 该弧相关信息的指针
} ArcNode;//单链表节点类型

typedef struct VNode {
	int data; // 顶点信息
	ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode;//数组元素类型

typedef struct {
	VNode  arc[MAXSIZE]; 
	int   vexnum, arcnum;
	int  kind; //表示有向图还是无向图
} Graphs;

//深度优先搜索
void DFSTraverse(Graphs G){
	for(int v=0;v<G.vexnum;++v){
		visited[v]=0;
		for(v=0;v<G.vexnum;++v){
			if(!visited[v])
				DFS(G,v);
		}
	}

}

void DFS(Graphs G,int v){
	printf("%d\t",v);
	visited[v]=1;
	p=G.arc[v].firstarc;
	while(p){
		w=p->vex;
		if(visited[w]==0)
			DFS(G,w);
			p=p->link;
	}
}

在这里插入图片描述

图的遍历——广度优先搜索(BFS)

■ 广度优先搜索生成树:访问时经过的顶点和边构成的子图。
■ 广度优先搜索生成森林:选用多个出发点做广度优先搜索,会产生多棵广度优先搜索生成树—构成广度优先搜索生成森林。
■ 对连通图,从起始点v到其余各顶点必定存在路径。按此路径长度递增次序访问。

在这里插入图片描述

int visited[Max];
void BFSTraverse(Graphs G){   
	for(v=0; v<G.vexnum; ++v) visited[v] = 0;
 	for( v=0; v<G.vexnum; ++v ) 
 	if(!visited[v]) 
 		BFS(G, v);
}

void BFS(Graphs G,int v){
	int Q[MAX],f=0,r=0;
	printf("%d\t",w);
	visited[v]=1;
	Q[r++]=v;
	while(f<r){
		x=Q[f++];
		p=G.arc[x].firstarc;
		while(p){
			w=p->vex;
			if(visited[w]==0){
				visited[w]=1;
				printf("%d\t",w);
				Q[r++]=w;
			}
			p=p->link;
		}
	}
}


最小生成树

四、图的遍历算法的应用(无向图)

(待补充)
求两个点之间的最短路径
求两个顶点之间的简单路径
直接使用深度优先搜索还不太行 需要先处理一下
遍历应用举例:

  • 判断图的连通性、
  • 求等价类等
  • 求连通分量
  • 求路径相通

五、图的连通性问题

生成树的存放方式:

  1. 孩子兄弟表示法
  2. 双亲表示法

⮚ 若从无向图中任一点出发采用深度优先搜索或广度优先搜索能访问到图中所有顶点,则该图为连通图,否则为非连通图

对连通图:深度优先搜索或广度优先搜索访问时经过的顶点和边构成的子图称为深度优先搜索生成树或广度优先搜索生成树

对非连通图:深度优先搜索或广度优先搜索访问时经过的顶点和边构成的子图称为深度优先搜索生成森林或广度优先搜索生成森林

生成树

生成树 子图 连通的子图
■ 生成树:假设一个连通图有 n 个顶点和 e 条边,其中 n-1
条边和 n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。

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

最小生成树 带权图的生成树上的各边权值之和 称为这棵树的代价。最小代价生成树是各边权值总和最小的生成树

最小生成树的性质(MST性质) 采用深度优先搜索 或 广度优先搜索 求? 不太行

贪心策略 不一定是最优解 但在生成最小生成树的时候 是适用的 Prim普利姆算法 Kruscal算法

具有MST性质 就是最小生成树

MST性质(最小生成树性质): 令G=(V, E,
W)为一个带权连通图,T为G的一生成树。对任一不在T中的边uv,如果将uv加入T中会产生一回路,使得uv是回路中权值最大的边。那么树T具有MST性质。

Prim算法

图采用邻接矩阵邻接表存放均可。下面以邻接矩阵为例实现prim算法

define MAX 100
define MAXEDGE 1000000
typedef struct{
	int arcs[MAX][MAX];
	int vexnum,arcnum;
}AGraphs;

Prim算法代码示例:

define MAX 100
define MAXEDGE 1000000
typedef struct{
	int arcs[MAX][MAX];
	int vexnum,arcnum;
}AGraphs;

typedef struct{
	int adjvex;
	int lowcost;
}EdgeType;
/*

当顶点v尚未加入生成树时,closedge[v]存放的是v与生成树中的顶点相连的最好情况:v与生成树中的顶点的所有连边中权值最小的那条边;closedge[v].adjvex存放的这条权值最小的边的另一个顶点,closedge[v].lowcost存放的这条权值最小的边的权值

如何区分生成树中的顶点和不在生成树中的顶点呢?

closedge[w].lowcost==0表示w已经加入生成树
*/
void prim(AGraphs G,int u){
	int i,j,k;
	EdgeType closedge[MAX];
	for(j=0;j<G.vexnum;j++){	
		closedge[j].adjvex=u;
		closedge[j].lowcost=G.arcs[u][j];
	} 
	closedge[u].lowcost=0;
	for(i=1;i<G.vexnum;i++){ 
		k=minclosedge(closedge); 
		printf("(%d,%d)", closedge[k].adjvex,k);
		closedge[k].lowcost=0; 
		for(j=0;j<G.venum;j++)
			if(G.arcs[k][j]< closedge[j].lowcost){ 
				closedge[j].lowcost= G.arcs[k][j]; 
				closedge[j].adjvex =k;
			}
	}
}

int minclosedge(EdgeType closedge[]){
	int min,j,k; min=MAXEDGE; k=-1;
	for(j=0;j<G.vexnum;j++)
		if(closedge[j]. lowcost !=0&&closedge[j].lowcost<min){
			min=closedge[j]. lowcost; k=j;
		}
	return k;
}
//时间复杂度:O(n2) Prim算法适合于稠密图

问法
最小生成树的求解过程
文字叙述 画表 求解过程
伪码描述(上述程序)

Kruskal 算法

先排序
对所有边按照权值升序排序
从小开始加 只要不产生回路
最后加到 n − 1 n-1 n1
需要 排序(适合于吸收图)

Kruscal算法适合稀疏图,时间复杂度为O(eloge),e为图的边数,因为该算法要对边按照权值排序,(堆、快速。归并)排序算法的平均时间复杂度O(eloge)

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

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

相关文章

cdp集群Hbase组件HRegionServer服务停止原因以及排查

前言&#xff1a;重启集群后某一节点HRegionServer服务停止&#xff0c;重启前所有服务均正常 去查看日志&#xff1a; 日志报错 ERROR HRegionServer Master rejected startup because clock is out of sync org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.h…

Amazon云计算AWS之[1]基础存储架构Dynamo

文章目录 Dynamo概况Dynamo架构的主要技术主要问题及解决方案Dynamo的存储节点数据均衡分布的问题一致性哈希算法改进一致性哈希算法 数据备份数据冲突问题成员资格及错误检测容错机制临时故障处理机制永久性故障处理机制 Dynamo概况 面向服务的Amazon平台基本架构为了保证其稳…

【深度学习】Vision Transformer

一、Vision Transformer Vision Transformer (ViT)将Transformer应用在了CV领域。在学习它之前&#xff0c;需要了解ResNet、LayerNorm、Multi-Head Self-Attention。 ViT的结构图如下&#xff1a; 如图所示&#xff0c;ViT主要包括Embedding、Encoder、Head三大部分。Class …

小球反弹(蓝桥杯)

文章目录 小球反弹【问题描述】答案&#xff1a;1100325199.77解题思路模拟 小球反弹 【问题描述】 有一长方形&#xff0c;长为 343720 单位长度&#xff0c;宽为 233333 单位长度。在其内部左上角顶点有一小球&#xff08;无视其体积&#xff09;&#xff0c;其初速度如图所…

Targeted influence maximization in competitive social networks

abstract 利用口碑效应的广告对于推销产品是相当有效的。在过去的十年中&#xff0c;人们对营销中的影响力最大化问题进行了深入的研究。影响力最大化问题旨在将社交网络中的一小群人识别为种子&#xff0c;最终他们将引发网络中最大的影响力传播或产品采用。在网络营销的实际场…

微信小程序日期增加时间完成订单失效倒计时(有效果图)

效果图 .wxml <view class"TimeSeond">{{second}}</view>.js Page({data: {tiem_one:,second:,//倒计时deadline:,},onLoad(){this.countdown();},countdown(){let timestamp Date.parse(new Date()) / 1000;//当前时间戳let time this.addtime(2024…

记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)

一、背景 最近有一次在系统并发比较高的时候&#xff0c;数据库突然发生了故障&#xff0c;导致大量请求失败&#xff0c;在数据库宕机不久&#xff0c;通过应用日志可以看到系统发生了OOM。 二、排查 初次看到这个现象的时候&#xff0c;我还是有点懵逼的&#xff0c;数据库…

k8s 部署 kube-prometheus监控

一、Prometheus监控部署 1、下载部署文件 # 使用此链接下载后解压即可 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/release-0.13.zip2、根据k8s集群版本获取不同的kube-prometheus版本部署 https://github.com/prometheus-operator/k…

基于SSM的物流快递管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物流快递管理系统2拥有三个角色&#xff1a; 管理员&#xff1a;用户管理、管理员管理、新闻公告管理、留言管理、取件预约管理、收件管理、货物分类管理、发件信息管理等 用户…

C#在窗体中设计滚动字幕的方法:创建特殊窗体

目录 1.涉及到的知识点 (1)Timer组件 (2)Label控件的Left属性 (3)启动和关闭Timer计时器 2. 实例 &#xff08;1&#xff09;Resources.Designer.cs设计 &#xff08;2&#xff09; Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#…

社交媒体数据恢复:与你科技

在数字时代&#xff0c;数据是我们生活中的重要组成部分。无论是个人照片、文档&#xff0c;还是企业的重要资料&#xff0c;数据在我们的生活中扮演着举足轻重的角色。然而&#xff0c;数据丢失的问题时常发生&#xff0c;给我们带来了很多麻烦。幸运的是&#xff0c;当下众多…

CentOS 7静默安装Oracle 11g(记一次最小化CentOS 7安装Oracle 11g的经历)

# [pdf在线免费转word文档](https://orcc.online/pdf) https://orcc.online/pdf 1.最小化安装CentOS 7后首先设置一下固定IP 可以先查询一下自己的网卡设备的名称&#xff0c;是ens33&#xff0c;所以网卡配置文件名称就是ifcfg-ens33&#xff08;前面的ifcfg-不用管&#xf…

Discuz! X3.4 升级至 Discuz! X3.5 详细教程

第一步&#xff1a;从其他以前的 Discuz! X 版本升级Discuz! X3.4 请先升级到Discuz! X3.4&#xff0c;升级教程网上比较普遍&#xff0c;在此不再论述。 第二步&#xff1a;Discuz! X3.4 升级至 Discuz! X3.5 &#xff08;Discuz 从 X3.5 以后&#xff0c;不在发布GBK版本&…

【Unity学习笔记】第十三 · tag与layer(运行时创建tag和layer)

参考&#xff1a; Unity手册 标签Unity手册 LayersIs it possible to create a tag programmatically?脚本自动添加tag和Layer 注&#xff1a;本文使用Unity版本是2022.3.23f1 转载引用请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/de…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…

给rwkv-pytorch 写个chat ui demo

rwkv-pytorch 项目地址 rwkv-pytorch from nicegui import uimessage_dict {1: [{"name":"Assistant","text":"你好"}]} current_name 1 import aiohttpasync def get_text_async(text"Hello, how are you?"):# 定义AP…

JAVA 项目<果园之窗>_1

这几天有空看能不能把水果店管理系统整出来&#xff0c;目标是整个网页版本的&#xff0c;以我的电脑做服务器&#xff0c;数据存在mysql中 以我目前的理解整个项目大致可分为前端部分、后端部分、数据库部分&#xff0c;也就这三个部分 目前打开并运行了一个别人的项目&#…

盒子模型之怪异盒模型

这个是标准盒模型 这个是怪异盒模型 box-sizing:content-box;默认是标准盒模型 box-sizing:border-box;是怪异盒模型&#xff0c;会挤压里面的内容&#xff0c;不管怎么设置边框始终都是当初设置的200px <!DOCTYPE html> <html lang"en"> <head>…

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统&#xff0c;由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求&#xff0c;提供高可用性、横向扩展能力和灵活的数据模型。 主要特点&#xff1a; 文档模型&#xff1a; Mon…

前端vue自定义table 表格 表格组件 Excel组件

前端组件化开发与Excel组件设计 一、前端开发的复杂性与组件化的必要性 随着技术的发展&#xff0c;前端开发的复杂度越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&…