图 Graph-图的表示及其遍历
2018-03-05 16:19:46
图是计算机科学中的一个非常重要的概念,图是一种多对多的关系。从某种角度上来说树和链表都是图的一种特例。

一、图的抽象数据类型

二、表示图的方法
图是由结点和边构成的,只要能通过某种方式将结点和边的信息表示出来就可以了。以下是两种最常见的图的表示方法,值得一提的是,并不是只有这两种方法来表示图。
- 邻接矩阵
邻接矩阵G[N][N]——N 个顶点从0 到N-1 编号。

对于无向图,邻接矩阵是对称的,所以可以只保存下三角来减少一半的空间开销。

邻接矩阵的优点:
- 直观、简单、好理解
- 方便检查任意一对顶点间是否存在边
- 方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
- 方便计算任一顶点的“度”(从该点发出的边数为“出度”,指向该点的边数为“入度”)
邻接矩阵的缺点:
- 浪费空间:对于稀疏的图将存放大量无用的数据;
- 浪费时间:比如查找一个结点的邻接点,需要将所有的结点遍历一遍;
- 邻接表
邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素,也就是直接相邻的结点。一定要足够的稀疏才合算。

邻接表的特点:
- 方便找任一顶点的所有“邻接点”
- 节约稀疏图的空间(需要N个头指针 + 2E个结点(每个结点至少2 个域))
- 方便计算任一顶点的“度”:仅对于无向图,如果是有向图,那么只能很快的计算出度,入度的计算还是有难度的
- 相对于邻接矩阵,邻接表并不适合很快的查找两个结点之间是否存在边
三、图的遍历
类似于二叉树的遍历,图的遍历也有两种策略,一是深度优先,二是广度优先。
- DFS
所谓遍历,就是将图中所有的结点访问一次,且仅一次。深度优先搜索就是每次到达一个结点,首先申明我访问过他了,避免二次访问,然后在其邻接的结点中挑选是否有还没有被访问的,访问之,重复进行该项操作,即可。

- BFS
BFS类似于二叉树中的层序遍历,使用队列来保存将要访问的结点信息。

在遍历的过程中,还有一个特别重要的概念--连通性。
连通分量 :无向图的极大连通子图

强连通 :有向图中顶点V和W之间存在双向路径,则称V和W是强连通的。
强连通图 :有向图中任意两顶点均强连通
强连通分量 :有向图的极大强连通子图

对于不连通的图可以对每个连通分量做一次DFS(或者BFS)。

四、应用实例
问题一:解救007
问题描述:詹姆斯邦德被困在孤岛上,孤岛周围环绕的鳄鱼,他的跳跃半径已知,在其跳跃半径内,他可以跳上鳄鱼的头。试问其是否可以上岸。

问题求解:该问题中的结点有孤岛,鳄鱼和岸。请注意,这里岸也是一个结点,所谓的结点其实是一个非常抽象的概念。问题要求的其实就是在这个图中是否可以在遍历过程中遍历到岸这个结点,如果可以那么就返回TRUE。
那是否需要构造一个邻接矩阵,或者邻接表呢?答案是否定的,就像之前提到的,不是说图都要用这两种表示方法来描述,这一题中,可以直接对两个鳄鱼之间的距离进行判断,就可以得到是否存在边的信息。


问题二:六度空间
问题描述:
六度空间理论,你和任何一个陌生人之间所间隔的人不会超过六个。
现给定社交网络图,请对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
问题求解:
按层序遍历,主要的难点就是如何保证只遍历到6层就结束。当然,有种简单的方式就是给每个结点增加一条层数信息,但是这样毫无疑问是非常消耗空间的,这里给出了一种O(1)的解决层数记录的方法,非常巧妙。


图 Graph-图的表示及其遍历的更多相关文章
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL))
关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph Learning (PGL)) 欢迎fork本项目原始链接:关于图计算&图学习的基础知识概览:前置知识点学习 ...
- 纸上谈兵: 图 (graph)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 图(graph)是一种比较松散的数据结构.它有一些节点(vertice),在某些节 ...
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (三)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...
- 图 Graph
本文主要内容为:图的定义以及基本术语 图的定义 图 图G的组成:由 数据元素的集合E 和 数据间的关系集合E 组成,记作:G = <V, E> 顶点 (vertex):数据元素,V就是顶点 ...
- ADT图及图的实现及图的应用
图: 图中涉及的定义: 有向图: 顶点之间的相关连接具有方向性: 无向图: 顶点之间相关连接没有方向性: 完全图: 若G是无向图,则顶点数n和边数e满足:0<=e<=n(n-1)/2,当e ...
- JanusGraph : 图和图数据库的简介
JanusGraph:图数据库系统简介 图(graph)是<数据结构>课中第一次接触到的一个概念,它是一种用来描述现实世界中个体和个体之间网络关系的数据结构. 为了在计算机中存储图,< ...
- 06. Matplotlib 2 |折线图| 柱状图| 堆叠图| 面积图| 填图| 饼图| 直方图| 散点图| 极坐标| 图箱型图
1.基本图表绘制 plt.plot() 图表类别:线形图.柱状图.密度图,以横纵坐标两个维度为主同时可延展出多种其他图表样式 plt.plot(kind='line', ax=None, figsiz ...
随机推荐
- Linux shell 程序设计
shell 程序设计 主要的学习内容包含基本思路,语法:变量.条件判断和程序控制,命令列表,函数,命令及执行,调试,grep命令和正则表达式,find命令 什么是shell 适用编写执行相对简单任务的 ...
- MySQL基础命令
目录: MySQL概述 安装及启动登陆mysql操作 MySQL基本数据类型 MySQL数据库基本SQL操作 MySQL高级SQL操作 一.MySQL概述 1.什么是数据库? 数据库(Database ...
- 详解MySQL第一篇—MySQL简要介绍及DDL语句
背景:近几年,开源数据库逐渐流行起来.由于具有免费使用.配置简单.稳定性好.性能优良等优点,开源数据库在中低端应用上占据了很大的市场份额,而 MySQL 正是开源数据库中的杰出代表.MySQL 数据库 ...
- mysql数据库从删库到跑路之mysql存储引擎
一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用pn ...
- springBoot 整合 RabbitMQ 的坑
1.Consumer raised exception, processing can restart if the connection factory supports it. Exception ...
- Linux系统——rpm命令
(1)查看操作系统名字.版本cat /etc/redhat-release 查看系统内核kernel的版本号uname -r查看操作系统位数uname -m (2)rpm命令rpm 参数 软件名-q ...
- 31. Next Permutation (下一个全排列)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- POJ - 2175 Evacuation Plan (最小费用流消圈)
题意:有N栋楼,每栋楼有\(val_i\)个人要避难,现在有M个避难所,每个避难所的容量为\(cap_i\),每个人从楼i到避难所j的话费是两者的曼哈顿距离.现在给出解决方案,问这个解决方案是否是花费 ...
- java synchronized关键字的底层实现
每个对象都有一个锁(Monitor,监视器锁),class对象也有锁,如果synchronized关键字修饰同步代码块,通过反编译可以看到,其实是有个monitorenter和monitorexit指 ...
- 关于iOS UIWebView 加载网页,点击网页内某些控件导致 Application 'UIKitApplication:xxx.xxx.xxx' was killed by jetsam.
问题:公司用的腾讯问卷系统,内嵌在我们应用或游戏的自定义UIWebView里面展示,发现在iOS 10 以下系统,点击圆形勾选框 会大概率出现闪退. 通过联调发现:报了这样一个警告Applicatio ...