数据结构图(数据结构图的定义)

本篇文章给大家谈谈数据结构图,以及数据结构图的定义对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

数据结构——图graph(基础概念)

【各种东拼西凑来的】

图(Graph)是由顶点和连接顶点的边构成的离散结构。在计算机科学中,图是最灵活的数据结构之一,很多问题都可以使用图模型进行建模求解。例如:生态环境中不同物种的相互竞争、人与人之间的社交与关系网络、化学上用图区分结构不同但分子式相同的同分异构体、分析计算机网络的拓扑结构确定两台计算机是否可以通信、找到两个城市之间的最短路径等等。

图的结构很简单,就是由顶点$V$集和边$E$集构成,因此图可以表示成$G=(V, E)$。

注意: 顶点有时也称为节点或者交点,边有时也称为链接。

无向图

我们可以说这张图中,有点集$V=\{1, 2, 3, 4, 5, 6\}$,边集$E=\{(1, 2), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5), (4, 6)\}$。在无向图中,边$(u, v)$和边$(v, u)$是一样的,因此只要记录一个就行了。简而言之,对称。

有向图

也很好理解,就是加上了方向性,顶点$(u, v)$之间的关系和顶点$(v,u)$之间的关系不同,后者或许不存在。例如,地图应用中必须存储单行道的信息,避免给出错误的方向。

加权图 :

权:与图升含的边或弧相关的数叫做权。

与加权图对应的就是无权图,或叫等权图。如果一张图不含权重信息,我们就认为边与边之间没有差别。不过,具体建模的时候,很多时候都需要有权重,比如对中国重要城市间道路联系的建模,总不能认为从北京去上海和从北京去广州一样远(等权)。

还有很多细化的概念,比如:无向图中,任意两个顶点间都有边,称为 无向完全图 ;加权图起一个新名字,叫 网(network) ……然而,如无携毕必要,毋增实体。

邻接(adjacency) :邻接是 两个顶点之间 的一种关系。如果图包含$(u,v)$,则称顶点$v$与顶点$u$邻接。当然,在无向图中,这也意味着顶点$u$与顶点$v$邻接。

关联(incidence) :关联是 边和顶点之间 的关系。在有向图中,边$(u,v)$从顶点$u$开始关联到$v$,或者相反,从$v$关联到$u$。注意,有向图中,边不一定是对称的,有去无回是完全有可能的。细化这个概念,就有了顶点的 入度(in-degree) 和 出度(out-degree) 。无向图中,顶点的度就是与顶点相关联的边的数目,没有入度和出度。在有向图中,我们以图1-2为例,顶点10有2个入度,$3\rightarrow10$,$11\rightarrow10$,但是没有从10指向其它顶点的边,因此顶点10的出吵隐笑度为0。

路径(path) :依次遍历顶点序列之间的边所形成的轨迹。注意,依次就意味着有序,先1后2和先2后1不一样。

简单路径 : 没有重复顶点的路径称为简单路径。说白了,这一趟路里没有出现绕了一圈回到同一点的情况,也就是没有 环 。

环/回路 :包含相同的顶点两次或者两次以上。图1-3中的顶点序列$1,2,4,3,1$,1出现了两次,当然还有其它的环,比如$1,4,3,1$。

简单回路/简单环: 除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路

无环图 :没有环的图,其中, 有向无环图 有特殊的名称,叫做 DAG(Directed Acyline Graph) (最好记住,DAG具有一些很好性质,比如很多动态规划的问题都可以转化成DAG中的最长路径、最短路径或者路径计数的问题)。

两个连通分支:

连通的 :无向图中每一对不同的顶点之间都有路径。如果这个条件在有向图里也成立,那么就是 强连通 的。

连通分量 :无向图中的极大连通子图。

两点强连通:在有向图G中,如果两点互相可达

强连通图: 如果有向图G的每两个顶点都强连通(任意两点互相可达),称G是一个 强连通图 。

强连通分量: 非强连通有向图的极大强连通子图,称为强连通 分量 (strongly connected components)。

关节点(割点) :某些特定的顶点对于保持图或连通分支的连通性有特殊的重要意义。如果 移除某个顶点 将使图或者分支 失去连通性 ,则称该顶点为 关节点 。(在某图中,若删除顶点V以及V相关的边后,图的一个连通分量分割为两个或两个以上的连通分量,则称顶点V为该图的一个关节点)。

桥(割边) :和关节点类似,删除一条边,就产生比原图更多的连通分支的子图,这条边就称为 割边 或者 桥 。

双连通图 :在无向连通图中,如果删除该图的任何一个结点都不能改变该图的连通性,则该图为双连通的无向图。个人理解就是一个双连通图没有割点,没有桥的图。

1.2 一些有趣的图概念

这一部分属于图论的内容,基础图算法不会用到,但是我觉得挺有意思的,小记如下。【这部分我没看,照搬过来了】

同构 4 :图看起来结构不一样,但它是一样的。假定有$G_1$和$G_2$,那么你只要确认对于$G_1$中的所有的两个 相邻点 $a$和$b$,可以通过某种方式$f$映射到$G_2$,映射后的两个点$f(a)$、$f(b)$也是相邻的。换句话说,当两个简单图同构时,两个图的顶点之间保持相邻关系的一一对应。

图1-7就展示了图的同构,这里顶点个数很少判断图的同构很简单。我们可以把v1看成u1,自然我们会把u3看出v3。用数学的语言就是$f(u_1)=v_1$,$f(u_3)=v_3$。u1的另外一个连接是到u2,v1的另外一个连接是到v4,不难从相邻顶点的关系验证$f(u_2)=v_4$,$f(u_4)=v_2$。

欧拉回路(Euler Circuit) :小学数学课本上的哥尼斯堡七桥问题,能不能从镇里的某个位置出发 不重复的经过所有桥(边)并且返回出发点 。这也就小学的一笔画问题,欧拉大神解决里这个问题,开创了图论。结论很简单:至少2个顶点的连通多重图存在欧拉回路的充要条件是 每个顶点的度都是偶数 。证明也很容易,大家有兴趣可以阅读相关资料。结论也很好理解,从某个起点出发,最后要回起点,中间无论路过多少次起点,都会再次离开,进、出的数目必然相等,故一定是偶数。

哈密顿回路(Hamilton Circuit) :哈密顿回路条件就比欧拉回路严格一点, 不能重复经过点 。你可能会感到意外,对于欧拉回路,我们可以轻而易举地回答,但是 我们却很难解决哈密顿回路问题,实际上它是一个NP完全问题 。这个术语源自1857年爱尔兰数学家威廉·罗万·哈密顿爵士发明的智力题。哈密顿的智力题用到了木质十二面体(如图1-8(a)所示,十二面体有12个正五边形表面)、十二面体每个顶点上的钉子、以及细线。十二面体的20个顶点用世界上的不同城市标记。智力题要求从一个城市开始,沿十二面体的边旅行,访问其他19个城市,每个恰好一次,最终回到第一个城市。

因为作者不可能向每位读者提供带钉子和细线的木质十二面体,所以考虑了一个 等价的问题 :对图1-8(b)的图是否具有恰好经过每个顶点一次的回路?它就是对原题的解,因为这个平面图 同构 于十二面体顶点和边。

著名的 旅行商问题(TSP) 要求旅行商访问一组城市所应当选取的最短路线。这个问题可以归结为求完全图的哈密顿回路,使这个回路的边的权重和尽可能的小。同样,因为这是个NP完全问题,最直截了当的方法就检查所有可能的哈密顿回路,然后选择权重和最小的。当然这样效率几乎难以忍受,时间复杂度高达$O(n!)$。在实际应用中,我们使用的启发式搜索等 近似算法 ,可以完全求解城市数量上万的实例,并且甚至能在误差1%范围内估计上百万个城市的问题。

关于旅行商问题目前的研究进展,可以到 ... 。

1.3 小结

以为可以一带而过,结果写了那么多。也没什么好总结的了,当然这些也至是图论概念的一小部分,还有一些图可能我们以后也会见到,比如顺着图到网络流,就会涉及二分图,不过都很好理解,毕竟有图。

1、数组(邻接矩阵)

2、邻接表

3、十字链表

4、邻接多种表

数据结构——图

转自:

阅读目录

一,图的定义

二,图相关的概念和术语

三,图的创建和遍历

四,最小生成树和最短路径

五,算法实现

这一篇我们要总结的是图(Graph),图可能比我们之前学习的线性结构和树形结罩铅构都要复杂,不过没有关系,我们一点一点地来总结,那么关于图我想从以下几点进行总结:

1,图的定义?

2,图相关的概念和术语?

3,图的创建和遍历?

4,最小生成树和最短路径?

5,算法实现?

一,图的定义

什么是图呢?

图是一种复杂的非线性结构。

在线性结构中,数据元素之间满足唯一的线性关系,每个数据元素(除第一个和最后一个外)只有一个直接前趋和一个直接后继;

在树形结构中,数据元素之间有着明显的层次关系,并腔激且每个数据元素只与上一层中的一个元素(双亲节点)及下一层的多个元素(孩子节点)相关;

而在图形结构中,节点之间的关系是任意的,图中任意两个数据元素之间都有可能相关。

图G由两个集合V(顶点Vertex)和E(边Edge)组成,定义为G=(V,E)

二,图相关的概念和术语

1,无向图和有向图

对于一个图,若每条边都是没有方向的,则称该图为无向图。图示如下:

因此,(Vi,Vj)和(Vj,Vi)表示的是同一条边。注意,无向图是用小括号,而下面介绍的有向图是用尖括号。

无向图的顶点集和边集分别表示为:

V(G)={V1,V2,V3,V4,V5}

E(G)={(V1,V2),(V1,V4),(V2,V3),(V2,V5),(V3,V4),(V3,V5),(V4,V5)}

对于一个图G,若每条边都是有方向的,则称该图为有向图。图示如下。

因此,和是两条不同的有向边。注意,有向边又称为弧。

有向图的顶点集和边集分别表示为:

V(G)={V1,V2,V3}

E(G)={,,,}

2,无向完全图和有向完全图

我们将具有n(n-1)/2条边的无向图称为无向完全图。同理,将具有n(n-1)条边的有向图称为有向完全图。

3,顶点的度

对于无向图,顶点的度表示以该顶点作为一个端点的边的数目。比如,图(a)无向图中顶点V3的度D(V3)=3

对于有向图,顶点的度分为入度和出度。入度表示以该顶点为终点的入边物圆好数目,出度是以该顶点为起点的出边数目,该顶点的度等于其入度和出度之和。比如,顶点V1的入度ID(V1)=1,出度OD(V1)=2,所以D(V1)=ID(V1)+OD(V1)=1+2=3

记住,不管是无向图还是有向图,顶点数n,边数e和顶点的度数有如下关系:

因此,就拿有向图(b)来举例,由公式可以得到图G的边数e=(D(V1)+D(V2)+D(V3))/2=(3+2+3)/2=4

4,子图

故名思义,这个就不解释了。

5,路径,路径长度和回路

路径,比如在无向图G中,存在一个顶点序列Vp,Vi1,Vi2,Vi3…,Vim,Vq,使得(Vp,Vi1),(Vi1,Vi2),…,(Vim,Vq)均属于边集E(G),则称顶点Vp到Vq存在一条路径。

路径长度,是指一条路径上经过的边的数量。

回路,指一条路径的起点和终点为同一个顶点。

6,连通图(无向图)

连通图是指图G中任意两个顶点Vi和Vj都连通,则称为连通图。比如图(b)就是连通图。下面是一个非连通图的例子。

上图中,因为V5和V6是单独的,所以是非连通图。

7,强连通图(有向图)

强连通图是对于有向图而言的,与无向图的连通图类似。

8,网

带”权值”的连通图称为网。如图所示。

三,图的创建和遍历

1,图的两种存储结构

1) 邻接矩阵,原理就是用两个数组,一个数组保存顶点集,一个数组保存边集。下面的算法实现里边我们也是采用这种存储结构。如下图所示:

2) 邻接表,邻接表是图的一种链式存储结构。这种存储结构类似于树的孩子链表。对于图G中每个顶点Vi,把所有邻接于Vi的顶点Vj链成一个单链表,这个单链表称为顶点Vi的邻接表。

2,图的两种遍历方法

1) 深度优先搜索遍历

深度优先搜索DFS遍历类似于树的前序遍历。其基本思路是:

a) 假设初始状态是图中所有顶点都未曾访问过,则可从图G中任意一顶点v为初始出发点,首先访问出发点v,并将其标记为已访问过。

b) 然后依次从v出发搜索v的每个邻接点w,若w未曾访问过,则以w作为新的出发点出发,继续进行深度优先遍历,直到图中所有和v有路径相通的顶点都被访问到。

c) 若此时图中仍有顶点未被访问,则另选一个未曾访问的顶点作为起点,重复上述步骤,直到图中所有顶点都被访问到为止。

图示如下:

注:红色数字代表遍历的先后顺序,所以图(e)无向图的深度优先遍历的顶点访问序列为:V0,V1,V2,V5,V4,V6,V3,V7,V8

如果采用邻接矩阵存储,则时间复杂度为O(n2);当采用邻接表时时间复杂度为O(n+e)。

2) 广度优先搜索遍历

广度优先搜索遍历BFS类似于树的按层次遍历。其基本思路是:

a) 首先访问出发点Vi

b) 接着依次访问Vi的所有未被访问过的邻接点Vi1,Vi2,Vi3,…,Vit并均标记为已访问过。

c) 然后再按照Vi1,Vi2,… ,Vit的次序,访问每一个顶点的所有未曾访问过的顶点并均标记为已访问过,依此类推,直到图中所有和初始出发点Vi有路径相通的顶点都被访问过为止。

图示如下:

因此,图(f)采用广义优先搜索遍历以V0为出发点的顶点序列为:V0,V1,V3,V4,V2,V6,V8,V5,V7

如果采用邻接矩阵存储,则时间复杂度为O(n2),若采用邻接表,则时间复杂度为O(n+e)。

四,最小生成树和最短路径

1,最小生成树

什么是最小生成树呢?在弄清什么是最小生成树之前,我们需要弄清什么是生成树?

用一句语简单概括生成树就是:生成树是将图中所有顶点以最少的边连通的子图。

比如图(g)可以同时得到两个生成树图(h)和图(i)

知道了什么是生成树之后,我们就很容易理解什么是最小生成树了。所谓最小生成树,用一句话总结就是:权值和最小的生成树就是最小生成树。

比如上图中的两个生成树,生成树1和生成树2,生成树1的权值和为:12,生成树2的权值为:14,我们可以证明图(h)生成树1就是图(g)的最小生成树。

那么如何构造最小生成树呢?可以使用普里姆算法。

2,最短路径

求最短路径也就是求最短路径长度。下面是一个带权值的有向图,表格中分别列出了顶点V1其它各顶点的最短路径长度。

表:顶点V1到其它各顶点的最短路径表

从图中可以看出,顶点V1到V4的路径有3条(V1,V2,V4),(V1,V4),(V1,V3,V2,V4),其路径长度分别为15,20和10,因此,V1到V4的最短路径为(V1,V3,V2,V4)。

那么如何求带权有向图的最短路径长度呢?可以使用迪杰斯特拉(Dijkstra)算法。

数据结构-图的简介

举个例子,微信中许许多多的用户组成了一个多对多的朋友关系网,这个关系网就是数据结构中的图(Graph)。

图,是一种比树更为复杂的数据结构,树的节点之间是一对多的关系,并且存在父与子的层级划分,而图的顶点(注意在此不叫节点)之间是多对多的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。

在图中,最基本的单元是 顶点 ,相当于树中的节点,顶点之间的关联关系,被称为 边 。

在一些图中,每一条边并不是完全等同的,使得边具有 权重 ,涉及到权重的图,称为 带权图 。

还有一些图中,顶点之间的关联并不是完全对称的,举个例子比如说微博,你的粉丝列表里有我,但我的粉丝列表里未必有你,类似于这种单方面关注的,顶点之间的边就有了方向的区分,这种带有方向的图称为 有向图 。

因此,综合有向无向、带权重不带权重,交叉来讲,图有带权重有向的、 带权重无向的 、不带权重的有向的、不带权重的无向的...

使用二维数组,表达各个顶点之间的关联关系

为了解决 邻接矩阵占用空间 的问题,人们想到了另一种图的表示方法:邻接表

在邻接表中,图的每一个顶点都兄派是一个链表的头节点,其晌枯后连接着该顶点能够直接达到的相邻顶点(在有向图中更能体现优势)

另外,其他表示方法:逆邻接表、十字链表...,在此不过多介绍了就。

即从图的某个顶点出发, 访问图中的所有顶点羡谨贺,且使每个顶点仅被访问一次 ,这个过程为图的遍历。

方法:BFS、DFS(具体介绍在之后章节,敬请期待。。。)

数据结构 - 图(基础概念)

[TOC]

我们知道, 数据结构 是存储相互之间存在的一种或多种特定关系的数据元素的集合。也即,数据结构是对数据的存储与数据关系的描述。

实际上,数据结构强调的是对数据关系的描述,存储只是为了持有数据,同时在底层以一个合适的存储结构对数据进行组织,以便更好地满足对数据关系的描述。

对于数据的存储结构,有按前驱后继的线性组织形式排列的,比如线性表。也有数据按层的方式进行组织的,比如说树(结点与结点之间是一种层次关系)。

但是,无论是哪种数据存储组织方式,其基本底层存储结构主要就是数组和链表。因此,很多其他的数据结构底层真正用于存储数据就是数组和链表,然后在这之上构建出线性或层次组织。

对于数据关系的描述,我们知道,数据之间存在四种关系:

简而言之, 图 是一种较线性表和树等数据结构更加复杂的结构,在图中,元素之间的关系可以是任意的,图中任意两个数据元素之间都可能存在关系。

因此,对于图的元素之间的关系描述就显得比较复杂。

简单来说, 图 是由顶点和边组合而成,其结构示意图如下所示:

对于图的定义,有以下几个地方需丛谈要明确注意:

图是一个相对复杂的数据结构,为了更好地对图进行描述,让我们先来了解下与图相关的一些基础概念,主要包含如下:

注 :实际上,如果一个图有 个顶点和小于 条边,则它是非连通图。

由前面的内容可以知道,图中的元素主要由顶点和边(或弧)组成,任意两个顶点之间都可禅郑培能存在联系,而顶点和边本身也存在联系,因此图的结构比较复杂,很难以数据元素在内存中的物理位置来表示图中元素之间的关系,也就是说, 图不可能仅用简单的顺序存储结构(即数组)来表示 。而多重链表尽管可以实现图结构(即以一个数据域和多个指针域组成的结点表示图中的一个顶点),但是却存在内存浪费或操作不便的问题。因此,图存储结构最终还是得通过结合顺序存储和链式存储才能做到比较好地实现。

当前用于图的存储主要有以下 5 种结构贺唯:

[img]

数据结构 - 图

前面我们学习了线性表,栈、队列和树。前面三者都属于线性表范畴,它的的数据元素是被串起来的,仅有线性关系,每个元素仅有一个直接前驱和一个直接后继,是属于一对一关系。在树里面,每个元素之间存在着明显的层次关系,每一层的元素可能和下一层的多个元素相关,但只能和上一层的一个元素相关,属于一对多的关系。而图是一种较线性表和树更为复杂的数据结构,在图的结构中,节点和节点的关系是任意的,图中任意两个数据元素都可能相关。

定义 :图( Graph )是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

在图中需要注意的是:

(1)线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)。

(2)线性表可以没有元素,称为空表;树中可以没有节点,称为空树;但是,在图中不允许没有顶点(有穷非空性)。

(3)线性表中的各元素是线性关系,树中的各元素是层次关系,而图中各顶点的关系是用边来表示(边集可以为空)。

顶点Vi的度(Degree)是指在图中与Vi相关联的边的条数。对于有向图来说,有入度(In-degree)和出度(Out-degree)之分,有向图顶点的度等于该顶点的入度和出度之和。

①若无向图中的两个顶点V1和V2存在一条边(V1,V2),则称顶点V1和V2邻接(Adjacent);

②若有向图中存在一条边V3,V2,则称顶点V3与顶点V2邻接,且是V3邻接到V2或V2邻接直V3;

注意:无向图中的边使用小括号“()”表示,而有向图中的边使用尖括号“”表示。

在无向图中,若从顶点Vi出发有一组边可到达顶点Vj,则称顶点Vi到顶点Vj的顶点序列为从顶点Vi到顶点Vj的路径(Path)。

若从Vi到Vj有路径可通,则称顶点Vi和顶点Vj是连通(Connected)的。

图的卖蠢御存储结构除了要存储图中的各个顶点本身的信息之外,还要存储顶点与档樱顶点之间的关系,因此,图的结构也比较复杂。常用的图的存储结构有邻接矩阵和邻接表等。

我们再来看一个有向图样例,如下图所示的左边。顶点数组为vertex[4]={v0,v1,v2,v3},弧数组arc[4][4]为下图右边这样的一个矩阵。主对角线上数值依然为0。但因为是有向图,所以此矩阵并不对称,比如由v1到v0有弧,得到arc[1][0]=1,而v到v没有弧,因此arc[0][1]=0。

注:由于存在n个顶点的图需要n*n个数组元素进行存储,当图为稀疏图时,使用邻接矩阵存储方法将会出现大量0元素,这会造成极大的空间浪费。这时,可以考虑使用邻接表表示法来存储图中的数据。

首先,回忆我们在线性表时谈到, 顺序存储结构 就存在预先分配内存可能造成存储空间浪费的问题,于是引出了 链式存储 的结构。同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题。

邻接表 由表头节点和表节点两部分组成,图中每个顶点均对应一个存储中岩在数组中的表头节点。如果这个表头节点所对应的顶点存在邻接节点,则把邻接节点依次存放于表头节点所指向的单向链表中。

上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7条边。

上图右边的矩阵是G1在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了"该顶点的邻接点的序号"。例如,第2个顶点(顶点C)包含的链表所包含的节点的数据分别是"0,1,3";而这"0,1,3"分别对应"A,B,D"的序号,"A,B,D"都是C的邻接点。就是通过这种方式记录图的信息的。

邻接表有向图是指通过邻接表表示的有向图。

上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"A,B,B,C,B,E,B,F,C,E,D,C,E,B,E,D,F,G"共9条边。

上图右边的矩阵是G2在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了"该顶点所对应的出边的另一个顶点的序号"。例如,第1个顶点(顶点B)包含的链表所包含的节点的数据分别是"2,4,5";而这"2,4,5"分别对应"C,E,F"的序号,"C,E,F"都属于B的出边的另一个顶点。

关于数据结构图和数据结构图的定义的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表