图(1)——图的定义和基本概念
2019独角兽企业重金招聘Python工程师标准>>>
概述
图(Graph)是一种比线性表和树更为复杂的数据结构。
线性结构:是研究数据元素之间的一对一关系。在这种结构中,除第一个和最后一个元素外,任何一个元素都有唯一的一个直接前驱和直接后继。
树结构:是研究数据元素之间的一对多的关系。在这种结构中,每个元素对下(层)可以有0个或多个元素相联系,对上(层)只有唯一的一个元素相关,数据元素之间有明显的层次关系。
图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。
图的基本概念
图的定义和术语
一个图(G)定义为一个偶对(V,E) ,记为G=(V,E) 。其中: V是顶点(Vertex)的非空有限集合,记为V(G);E是无序集V&V的一个子集,记为E(G) ,其元素是图的弧(Arc)。
将顶点集合为空的图称为空图。其形式化定义为:
G=(V ,E)
V={v|vÎdata object}
E={<v,w>| v,wÎV∧p(v,w)}
P(v,w)表示从顶点v到顶点w有一条直接通路。
弧(Arc) :表示两个顶点v和w之间存在一个关系,用顶点偶对<v,w>表示。通常根据图的顶点偶对将图分为有向图和无向图。
有向图(Digraph): 若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是有序的,称图G是有向图。
在有向图中,若 <v,w>ÎE(G) ,表示从顶点v到顶点w有一条弧。 其中:v称为弧尾(tail)或始点(initial node),w称为弧头(head)或终点(terminal node) 。
无向图(Undigraph): 若图G的关系集合E(G)中,顶点偶对<v,w>的v和w之间是无序的,称图G是无向图。
在无向图中,若"<v,w>ÎE(G) ,有<w,v>ÎE(G) ,即E(G)是对称,则用无序对(v,w) 表示v和w之间的一条边(Edge),因此(v,w) 和(w,v)代表的是同一条边。
例1:设有有向图G1和无向图G2,形式化定义分别是:
G1=(V1 ,E1)
V1={a,b,c,d,e}
E1={<a,b>,<a,c>, <a,e>,<c,d>,<c,e> ,<d,a>,<d,b>,<e,d>}
G2=(V2 ,E2)
V2={a,b,c,d}
E2={(a,b), (a,c), (a,d), (b,d), (b,c), (c,d)}
它们所对应的图如图所示。
完全无向图:对于无向图,若图中顶点数为n ,用e表示边的数目,则e Î[0,n(n-1)/2] 。具有n(n-1)/2条边的无向图称为完全无向图。完全无向图另外的定义是:
对于无向图G=(V,E),若"vi,vj ÎV ,当vi≠vj时,有(vi ,vj)ÎE,即图中任意两个不同的顶点间都有一条无向边,这样的无向图称为完全无向图。
完全有向图:对于有向图,若图中顶点数为n ,用e表示弧的数目,则eÎ[0,n(n-1)] 。具有n(n-1)条边的有向图称为完全有向图.完全有向图另外的定义是:
对于有向图G=(V,E),若"vi,vjÎV ,当vi ≠vj时,有<vi ,vj>ÎE∧<vj , vi >ÎE ,即图中任意两个不同的顶点间都有一条弧,这样的有向图称为完全有向图。
有很少边或弧的图(e<n㏒n)的图称为稀疏图,反之称为稠密图。
权(Weight):与图的边和弧相关的数。权可以表示从一个顶点到另一个顶点的距离或耗费。
子图和生成子图:设有图G=(V,E)和G’=(V’,E’),若V’ÌV且E’ÌE ,则称图G’是G的子图;若V’=V且E’ÌE,则称图G’是G的一个生成子图。
顶点的邻接(Adjacent):对于无向图G=(V,E),若边(v,w)ÎE,则称顶点v和w 互为邻接点,即v和w相邻接。边(v,w)依附(incident)与顶点v和w 。
对于有向图G=(V ,E),若有向弧<v,w>ÎE,则称顶点v “邻接到”顶点w,顶点w “邻接自”顶点v ,弧<v,w> 与顶点v和w “相关联” 。
顶点的度、入度、出度:对于无向图G=(V,E), "viÎV,图G中依附于vi的边的数目称为顶点vi的度(degree),记为TD(vi)。
显然,在无向图中,所有顶点度的和是图中边的2倍。 即 ∑TD(vi)=2e i=1, 2, …, n ,e为图的边数。
对有向图G=(V,E),若"vi ÎV ,图G中以vi作为起点的有向边(弧)的数目称为顶点vi的出度(Outdegree),记为OD(vi) ;以vi作为终点的有向边(弧)的数目称为顶点vi的入度(Indegree),记为ID(vi) 。顶点vi的出度与入度之和称为vi的度,记为TD(vi) 。即
TD(vi)=OD(vi)+ID(vi)
路径(Path)、路径长度、回路(Cycle) :对无向图G=(V,E),若从顶点vi经过若干条边能到达vj,称顶点vi和vj是连通的,又称顶点vi到vj有路径。
对有向图G=(V,E),从顶点vi到vj有有向路径,指的是从顶点vi经过若干条有向边(弧)能到达vj。或路径是图G中连接两顶点之间所经过的顶点序列。即
Path=vi0vi1…vim ,vijÎV且(vij-1, vij)ÎE j=1,2, …,m 或
Path=vi0vi1 …vim ,vijÎV且<vij-1, vij>ÎE j=1,2, …,m
路径上边或有向边(弧)的数目称为该路径的长度。
在一条路径中,若没有重复相同的顶点,该路径称为简单路径;第一个顶点和最后一个顶点相同的路径称为回路(环);在一个回路中,若除第一个与最后一个顶点外,其余顶点不重复出现的回路称为简单回路(简单环)。
连通图、图的连通分量:对无向图G=(V,E),若"vi ,vj ÎV,vi和vj都是连通的,则称图G是连通图,否则称为非连通图。若G是非连通图,则极大的连通子图称为G的连通分量。
对有向图G=(V,E),若"vi ,vj ÎV,都有以vi为起点, vj 为终点以及以vj为起点,vi为终点的有向路径,称图G是强连通图,否则称为非强连通图。若G是非强连通图,则极大的强连通子图称为G的强连通分量。
“极大”的含义:指的是对子图再增加图G中的其它顶点,子图就不再连通。
生成树、生成森林:一个连通图(无向图)的生成树是一个极小连通子图,它含有图中全部n个顶点和只有足以构成一棵树的n-1条边,称为图的生成树,如图所示。
关于无向图的生成树的几个结论:
◆ 一棵有n个顶点的生成树有且仅有n-1条边;
◆ 如果一个图有n个顶点和小于n-1条边,则是非连通图;
◆ 如果多于n-1条边,则一定有环;
◆ 有n-1条边的图不一定是生成树。
有向图的生成森林是这样一个子图,由若干棵有向树组成,含有图中全部顶点。
有向树是只有一个顶点的入度为0 ,其余顶点的入度均为1的有向图,如图7-3所示。
网:每个边(或弧)都附加一个权值的图,称为带权图。带权的连通图(包括弱连通的有向图)称为网或网络。网络是工程上常用的一个概念,用来表示一个工程或某种流程,如图7-4所示。
图的抽象数据类型定义
图是一种数据结构,加上一组基本操作就构成了图的抽象数据类型。图的抽象数据类型定义如下:
Graph{
数据对象V:具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR}
VR={<v,w>|<v,w>| v,wÎV∧p(v,w) ,<v,w>表示从v到w的弧,P(v,w)定义了弧<v,w>的信息 }
基本操作P:
添加顶点
添加边
获得顶点的个数
获得边的条数
移除顶点
移除边
……
}
图的接口Graph
package datastructure.graph;
/*** 图的接口* @author luoweifu**/
public interface Graph {/*** 添加顶点* @param v*/public void addVex(Object v);/*** 添加边* @param v1 第一个顶点* @param v2 第二个顶点* @param weight 权值*/public void addEdge(Object v1, Object v2, double weight);/*** 添加边* @param v1 第一个顶点* @param v2 第二个顶点* @param info 边信息* @param weight 权值*/public void addEdge(Object v1, Object v2, Object info, double weight);/*** 置空图*/public void clear();/*** 获得顶点v的第一个邻接结点* @param v 顶点* @return 顶点v的第一个邻接结点*/public Object getFirstVertex(Object v);/*** 在图G中寻找v1结点的邻接结点v2的下一个邻接结点* @param v1 顶点* @param v2 v1的一个邻接结点* @return 邻接v1的在v2后的一个结点*/public Object getNextVertex(Object v1, Object v2);/*** 获得顶点的个数* @return*/public int getVertexSize();/***获得边的条数* @return*/public int getEdgeSize();/*** 移除顶点* @param v 顶点*/public void removeVex(Object v);/*** 移除边* @param v1 顶点1* @param v2 顶点2*/public void removeEdge(Object v1, Object v2);/*** 深度优先遍历* @param o 遍历的初始顶点* @return 遍历的结果*/public String dfs(Object o);/*** 深度优先遍历* @param o 遍历的初始顶点* @return 遍历的结果*/public String bfs(Object o);/*** 打印图的各顶点* @return*/public String printGraph();
}
边的接口Edge
package datastructure.graph;public abstract class Edge implements Comparable{protected double weight;protected Object info;/*** 构造函数*/public Edge() {this.weight = 0;}/*** 构造函数* @param weight 权值*/public Edge(double weight) {this.weight = weight;}public Edge(Object info, double weight) {this.weight = weight;this.info = info;}/*** 获取权值* @return 权值*/public double getWeight() {return weight;}/*** 设置权值* @param weight 权值*/public void setWeight(double weight) {this.weight = weight;}/*** 获取边的信息* @return 边的信息*/public Object getInfo() {return info;}/*** 设置边的信息* @param info 边的信息*/public void setInfo(Object info) {this.info = info;}/*** 获取边的第一个顶点* @return 第一个顶点*/public abstract Object getFirstVertex();/*** 获取边的第二个顶点* @return 第二个顶点*/public abstract Object getSecondVertex();
}
转载于:https://my.oschina.net/verynix/blog/365760
图(1)——图的定义和基本概念相关推荐
- 【数据结构】图1——图的基本概念和术语、类型定义
文章目录 图的定义 图的术语 图的抽象数据类型定义 图的定义 图的术语 1.有向图:每条线都是有方向的. 2.无向图:每条线都是无方向的. 顶点:数据元素Vi称为顶点. 边:P(Vi,Vj)表示在顶点 ...
- 二叉树第i层中的所有结点_讲透学烂二叉树(二):图中树的定义amp;各类型树的特征分析...
日常中我们见到的二叉树应用有,Java集合中的TreeSet和TreeMap,C++ STL中的set.map,以及Linux虚拟内存的管理,以及B-Tree,B+-Tree在文件系统,都是通过红黑树 ...
- 图拉普拉斯矩阵的定义、推导、性质、应用
导语:在学习图神经网络时,不可避免地要遇到拉普拉斯算子,拉普拉斯矩阵,图傅里叶变换,拉普拉斯特征分解向量等等一堆概念,了解其中的来源,定义,推导,对于后续图卷积神经网络的演进过程会有更深刻的理解 文章 ...
- vb外部调用autocad_AutoCAD教程之图块的各种相关操作和概念
制图过程中,有时常需要插入某些特殊符号供图形中使用,此时就需要运用到图块及图块属性功能.利用图块与属性功能绘图,可以有效地提高作图效率与绘图质量.也是绘制复杂图形的重要组成部分. 一.图块的特点 图块 ...
- css背景图background - 多背景定义
css背景图background - 多背景定义 1. 方法一 .bg{height:600px;background: url(../../static/images/slider/zplc.png ...
- (转载)各种图的画法与定义
N-S图 描述程序逻辑时,表示嵌套和层次关系,并具有强烈的结构化特征 N-S图(Nassi和Scheiderman)把整个程序写在一个大框内,这个大框图是由若干个小的基本框图构成的流程图. PAD图 ...
- 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...
- 树 - 定义和基本概念
一.树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一棵非空树中:(1)有且仅有一个特定的称为根(root)的结点. (2)当n>1时,其余结点可分为m(m>0 ...
- 字节跳动自研万亿级图数据库 图计算实践 【太高级了,不是圈里的人,有简明见解的吗?】
1. 图状结构数据广泛存在 字节跳动的所有产品的大部分业务数据,几乎都可以归入到以下三种: 用户信息.用户和用户的关系(关注.好友等): 内容(视频.文章.广告等): 用户和内容的联系(点赞.评论.转 ...
最新文章
- 64位windows与32位windows的区别
- PIC单片机入门_PICC头文件介绍
- Django框架深入了解_02(DRF之序列化、反序列化)
- 【数据结构与算法】之深入解析“消除游戏”的求解思路与算法示例
- 【10.20校内测试】【小模拟】【无向图建树判奇偶环】【树上差分】
- c语言50行左右程序,谁有50行和300行左右又简单的程序,急需
- Java微服务篇1——SpringBoot
- 文档丨Oracle 20c 概念手册
- 【英语学习】【Daily English】U14 Transportation L02 I'm afraid that you're going in the wrong direction.
- 输入法中的全角和半角是什么,角又是什么
- Eclipse使用之添加字体
- python中的 __getattr__ __setattr__ __getitem__ __add__
- 展望Spring野心-Spring资源定位
- 我写了一个桌面搜索引擎
- 微信小程序多音频场景处理
- 保研之路——上交大电子系直博
- Java分数的加减乘除
- mysql护眼参数,VS2013设置护眼背景颜色
- c语言 switch案例,c语言switch case语句使用例子
- 10个超强英语学习资源网站,学霸们都在用!
热门文章
- mysql的count函数可以加表达式嘛_power bi15——power pivot的DAX表达式
- mysql补丁如何安装_神技_如何快捷下载Oracle补丁的方法?!
- JS循环精灵图背景-遍历背景图片
- 2022/4/3刷题
- 信道编码之编码理论依据
- 【ASP.NET Core】EF Core 模型与数据库的创建
- SpringBoot整合Freemarker+Mybatis
- .NET中IDisposable接口的基本使用
- Android Studio2.2.3 通过JNI引用ffmpeg库小结
- Zookeeper的安装配置及基本开发