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——图的基本概念和术语、类型定义

    文章目录 图的定义 图的术语 图的抽象数据类型定义 图的定义 图的术语 1.有向图:每条线都是有方向的. 2.无向图:每条线都是无方向的. 顶点:数据元素Vi称为顶点. 边:P(Vi,Vj)表示在顶点 ...

  2. 二叉树第i层中的所有结点_讲透学烂二叉树(二):图中树的定义amp;各类型树的特征分析...

    日常中我们见到的二叉树应用有,Java集合中的TreeSet和TreeMap,C++ STL中的set.map,以及Linux虚拟内存的管理,以及B-Tree,B+-Tree在文件系统,都是通过红黑树 ...

  3. 图拉普拉斯矩阵的定义、推导、性质、应用

    导语:在学习图神经网络时,不可避免地要遇到拉普拉斯算子,拉普拉斯矩阵,图傅里叶变换,拉普拉斯特征分解向量等等一堆概念,了解其中的来源,定义,推导,对于后续图卷积神经网络的演进过程会有更深刻的理解 文章 ...

  4. vb外部调用autocad_AutoCAD教程之图块的各种相关操作和概念

    制图过程中,有时常需要插入某些特殊符号供图形中使用,此时就需要运用到图块及图块属性功能.利用图块与属性功能绘图,可以有效地提高作图效率与绘图质量.也是绘制复杂图形的重要组成部分. 一.图块的特点 图块 ...

  5. css背景图background - 多背景定义

    css背景图background - 多背景定义 1. 方法一 .bg{height:600px;background: url(../../static/images/slider/zplc.png ...

  6. (转载)各种图的画法与定义

    N-S图 描述程序逻辑时,表示嵌套和层次关系,并具有强烈的结构化特征 N-S图(Nassi和Scheiderman)把整个程序写在一个大框内,这个大框图是由若干个小的基本框图构成的流程图. PAD图 ...

  7. 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战

    发现个好东西思维导图, 最近开始用MindManager整理博客 . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/deta ...

  8. 树 - 定义和基本概念

    一.树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一棵非空树中:(1)有且仅有一个特定的称为根(root)的结点. (2)当n>1时,其余结点可分为m(m>0 ...

  9. 字节跳动自研万亿级图数据库 图计算实践 【太高级了,不是圈里的人,有简明见解的吗?】

    1. 图状结构数据广泛存在 字节跳动的所有产品的大部分业务数据,几乎都可以归入到以下三种: 用户信息.用户和用户的关系(关注.好友等): 内容(视频.文章.广告等): 用户和内容的联系(点赞.评论.转 ...

最新文章

  1. 64位windows与32位windows的区别
  2. PIC单片机入门_PICC头文件介绍
  3. Django框架深入了解_02(DRF之序列化、反序列化)
  4. 【数据结构与算法】之深入解析“消除游戏”的求解思路与算法示例
  5. 【10.20校内测试】【小模拟】【无向图建树判奇偶环】【树上差分】
  6. c语言50行左右程序,谁有50行和300行左右又简单的程序,急需
  7. Java微服务篇1——SpringBoot
  8. 文档丨Oracle 20c 概念手册
  9. 【英语学习】【Daily English】U14 Transportation L02 I'm afraid that you're going in the wrong direction.
  10. 输入法中的全角和半角是什么,角又是什么
  11. Eclipse使用之添加字体
  12. python中的 __getattr__ __setattr__ __getitem__ __add__
  13. 展望Spring野心-Spring资源定位
  14. 我写了一个桌面搜索引擎
  15. 微信小程序多音频场景处理
  16. 保研之路——上交大电子系直博
  17. Java分数的加减乘除
  18. mysql护眼参数,VS2013设置护眼背景颜色
  19. c语言 switch案例,c语言switch case语句使用例子
  20. 10个超强英语学习资源网站,学霸们都在用!

热门文章

  1. mysql的count函数可以加表达式嘛_power bi15——power pivot的DAX表达式
  2. mysql补丁如何安装_神技_如何快捷下载Oracle补丁的方法?!
  3. JS循环精灵图背景-遍历背景图片
  4. 2022/4/3刷题
  5. 信道编码之编码理论依据
  6. 【ASP.NET Core】EF Core 模型与数据库的创建
  7. SpringBoot整合Freemarker+Mybatis
  8. .NET中IDisposable接口的基本使用
  9. Android Studio2.2.3 通过JNI引用ffmpeg库小结
  10. Zookeeper的安装配置及基本开发