邻接表

数据结构和算法系列17 图

ε祈祈猫儿з 提交于 2020-04-03 11:49:52
数据结构和算法系列17 图 阅读目录 一,图的定义 二,图相关的概念和术语 三,图的创建和遍历 四,最小生成树和最短路径 五,算法实现 这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结: 1,图的定义? 2,图相关的概念和术语? 3,图的创建和遍历? 4,最小生成树和最短路径? 5,算法实现? 回到顶部 一,图的定义 什么是图呢? 图是一种复杂的非线性结构。 在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继; 在树形结构中,数据元素之间有着明显的层次关系,并且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关; 而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。 图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E) 回到顶部 二,图相关的概念和术语 1,无向图和有向图 对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下: 因此,(V i ,V j )和(V j, V i )表示的是同一条边。注意, 无向图是用小括号,而下面介绍的有向图是用尖括号。 无向图的顶点集和边集分别表示为: V(G)={V 1 ,V 2 ,V

机器学习模型数据结构:logistic regression, neural network, convolutional neural network

妖精的绣舞 提交于 2020-03-10 17:46:32
可以用两种方式来看神经网络,一种就是层的集合,也就是层组成的数组,另一种是神经元的集合,也就是神经元组成的Graph。 基于神经元的实现方式中,需要定义两个类 Neuron, Weight Neuron类的实例相当于是vertex,Weight组成的链表相当于是邻接表和逆邻接表。 基于层的实现方式中,每种层都对应一种层类,分别是 LogisticRegressionLayer, HiddenLayer, LeNetPoolingLayer 暂时还没有画卷积层的数据结构,这里先给出一个卷积操作的描述: 来源: https://www.cnblogs.com/xinchrome/p/4996187.html

图(二):图的表示

扶醉桌前 提交于 2020-03-04 06:23:44
图的表示 (1)邻接矩阵(adjacency matrix) (2)邻接表(adjacency lists) 图G=(V, E)的邻接表表示由一个包含|V|个链表的数组Adj所组成,其中每个链表对应于V中的一个顶点。对于每一个u属于V,邻接表Adj[u]包含所有满足条件(u, v)属于E的顶点v。 (3)邻接集(adjacency sets) (4)边数组(array of edges):所有边构成的数组。 一般稀疏图使用邻接表,稠密图使用邻接矩阵。 图的操作 添加一条边 删除一条边 添加一个顶点 删除一个顶点 可以使用map替换array,set替换list,来方便进行更多的操作。 通过辅助数组,在图遍历的过程中,可以获取(保存)很多有用信息。 package mygraph; import edu.princeton.cs.algs4.*; import myutil.*; public class MyGraph { private int V; // number of vertices private int E; // number of edges private MyList<Integer>[] adj; // adjacency lists private Point2D[] points; // @SuppressWarnings("unchecked")

摘抄一篇:图的存储结构

筅森魡賤 提交于 2020-02-25 05:36:27
. 图的邻接矩阵(Adjacency Matrix)存储表示法        设图 A = (V, E)是一个有 n 个顶点的图, 图的邻接矩阵是一个二维数组 A.edge[n][n],  用来存放顶点的信息和边或弧的信息。定义为:       (1) 无向图的邻接矩阵是对称的;有向图的邻接矩阵可能是不对称的。 (2) 在有向图中, 统计第 i 行 1 的个数可得顶点 i 的出度,统计第 j 行 1 的个    数可得顶点j 的入度。在无向图中, 统计第 i 行 (列) 1 的个数可得顶点i的    度。 图的邻接矩阵存储表示: #define INFINITY INT_MAX // 最大值∞ #define MAX_VERTEX_NUM 20 // 最大顶点个数 typedef enum {DG, DN, AG, AN} GraphKind; // {有向图,有向网,无向图,无向网} typedef struct ArcCell { VRType adj; // VRType是顶点关系类型。对无权图,用1或0表示相邻否; // 对带权图,则为权值类型。 InfoType *info; // 该弧相关信息的指针 } ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { VertexType vexs

数组模拟邻接表

醉酒当歌 提交于 2020-02-25 05:24:54
1 const int N=maxn; 2 // maxn表示图中最大顶点数 3 const int E=maxe ; // maxe图中最大边数 4 struct Edge{ 5 int u,v; //边所邻接的两个顶点 6 int w; //边的权值 7 int next; //边指针,指向下一条边的内存地址 8 }edge[E]; // 静态内存,用于分配边 9 int head[N]; // 表头 10 int num; // 内存的指针 11 void init() 12 { 13 for(int i=0;i<E;i++) head[i]=-1; //这里为什么要设为-1 14 num= 0; 15 } 16 void addedge(int b,int e,int w) 17 { 18 edge[num].u=b; 19 edge[num].v=e; 20 edge[num].w=w; 21 edge[num].next=head[b]; 22 head[b]=num++; 23 } 24 来源: https://www.cnblogs.com/lyqlyq/p/6682588.html

邻接表(数组实现)

假装没事ソ 提交于 2020-02-25 05:11:11
之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行两个整数n m。n表示顶点个数(顶点编号为1~n),m表示边的条数。接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z。下图就是一种使用链表来实现邻接表的方法。 上面这种实现方法为图中的每一个顶点(左边部分)都建立了一个单链表(右边部分)。这样我们就可以通过遍历每个顶点的链表,从而得到该顶点所有的边了。使用链表来实现邻接表对于痛恨指针的的朋友来说,这简直就是噩梦。这里我将为大家介绍另一种使用数组来实现的邻接表,这是一种在实际应用中非常容易实现的方法。这种方法为每个顶点i(i从1~n)也都保存了一个类似“链表”的东西,里面保存的是从顶点i出发的所有的边,具体如下。 首先我们按照读入的顺序为每一条边进行编号(1~m)。比如第一条边“1 4 9”的编号就是1,“1 3 7”这条边的编号是5。 这里用u、v和w三个数组用来记录每条边的具体信息,即u[i]、v[i]和w[i]表示第i条边是从第u[i]号顶点到v[i]号顶点(u[i]àv[i]),且权值为w[i]。

巧妙的邻接表(数组实现)

别等时光非礼了梦想. 提交于 2020-02-25 05:08:55
之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。 4 51 4 94 3 81 2 52 4 61 3 7 第一行两个整数n m。n表示顶点个数(顶点编号为1~n),m表示边的条数。接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z。下图就是一种使用链表来实现邻接表的方法。 上面这种实现方法为图中的每一个顶点(左边部分)都建立了一个单链表(右边部分)。这样我们就可以通过遍历每个顶点的链表,从而得到该顶点所有的边了。使用链表来实现邻接表对于痛恨指针的的朋友来说,这简直就是噩梦。这里我将为大家介绍另一种使用数组来实现的邻接表,这是一种在实际应用中非常容易实现的方法。这种方法为每个顶点i(i从1~n)也都保存了一个类似“链表”的东西,里面保存的是从顶点i出发的所有的边,具体如下。 首先我们按照读入的顺序为每一条边进行编号(1~m)。比如第一条边“1 4 9”的编号就是1,“1 3 7”这条边的编号是5。 这里用u、v和w三个数组用来记录每条边的具体信息,即u[i]、v[i]和w[i]表示第i条边是从第u[i]号顶点到v[i]号顶点(u[i]àv[i]),且权值为w[i]。 再用一个first数组来存储每个顶点其中一条边的编号

邻接表(spfa模版)

可紊 提交于 2020-02-17 04:51:29
http://www.cnblogs.com/tonghao/p/4708661.html//数组模拟 邻接表只是储存图的方法,要求最短路还是要用其他算法。SPFA迪杰斯特拉等等算法。 #include<stdio.h> #include<iostream> #include<stdlib.h> #include<queue> #include<algorithm> #include<string.h> #define inf 0x3f3f3f using namespace std; bool vis[2005]; int dis[2005]; int T,N; struct node { int v,w; struct node*next; }*h[2005]; void LA(int u,int v,int w) { struct node *p=(struct node *)malloc(sizeof(struct node)); // p->u=u; p->v=v; p->w=w; p->next=h[u]; h[u]=p; } void spfa(int s) { queue<int>Q; memset(vis,false,sizeof(vis)); Q.push(s); dis[s]=0; while(!Q.empty()){ int u=Q.front(); Q

图的存储结构之邻接表(详解)

有些话、适合烂在心里 提交于 2020-02-12 15:04:04
图的存储结构之邻接表(详解) 之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。 1 2 3 4 5 6 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行两个整数n m。n表示顶点个数(顶点编号为1~n),m表示边的条数。接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z。下图就是一种使用链表来实现邻接表的方法。 上面这种实现方法为图中的每一个顶点(左边部分)都建立了一个单链表(右边部分)。这样我们就可以通过遍历每个顶点的链表,从而得到该顶点所有的边了。使用链表来实现邻接表对于痛恨指针的的朋友来说,这简直就是噩梦。这里我将为大家介绍另一种使用数组来实现的邻接表,这是一种在实际应用中非常容易实现的方法。这种方法为每个顶点i(i从1~n)也都保存了一个类似“链表”的东西,里面保存的是从顶点i出发的所有的边,具体如下。 首先我们按照读入的顺序为每一条边进行编号(1~m)。比如第一条边“1 4 9”的编号就是1,“1 3 7”这条边的编号是5。 这里用u、v和w三个数组用来记录每条边的具体信息,即u[i]、v[i]和w[i]表示第i条边是从第u[i]号顶点到v[i]号顶点(u[i]àv[i]),且权值为w[i

图的增删、遍历与应用实现

百般思念 提交于 2020-02-11 13:51:59
本文主要以一个带权有向图为例,讲解图相关的一些算法实现(Go语言),包括图的顶点和边的插入与删除操作,还有图的深度优先遍历和广度优先遍历,以及图的一些引申应用:最小生成树、从源点到其余各点的最短路径、拓扑排序。 一、图的概念 图是由顶点集合及顶点间的关系(边)集合组成的一种数据结构。 关于图的更多基本术语的概念可以参考: https://www.jianshu.com/p/d9ca383e2bd8 二、图的存储表示 图的存储表示形式有两种:邻接矩阵、邻接表,下面分别是这两种存储表示形式的示例。 一个无向图的邻接矩阵表示示例如下: 一个无向图的邻接表表示示例如下: 本文主要以一个带权有向图为例,使用邻接表进行存储表示,代码实现如下: /** * 带权有向图顶点数组节点结构 **/ type VertexArrayNode struct { data byte //顶点数据 link *EdgeListNode //出边链表 } /** * 带权有向图出边链表节点结构 **/ type EdgeListNode struct { vertexArrayIndex int //顶点数组索引 weight int //权重值 next *EdgeListNode //下一个指向节点 } /** * 带权有向图结构 **/ type ListGraph struct { slice []