讲透学烂二叉树(一):图的概念和定义—各种属性特征浅析

摘要:
树和图的概念图是一种特殊的数据结构,由点和边组成。它可以用来描述元素之间的网络关系。这个网络没有顺序或层次,只是简单地连接了元素。图的概念和基本性质图:图由边集和顶点集组成。

树和图的概念

图是一种特殊的数据结构,由点和边构成,它可以用来描述元素之间的网状关系,这个网状没有顺序,也没有层次,就是简单的把各个元素连接起来。

图的概念和基本性质

图(graph):图(graph)由边(edge)的集合及顶点(vertex)的集合组成。通常记为:G=(V,E)。对于两个图G和G’,如果G’的顶点集合与边集合均为G的顶点集合与边集合的子集,那么称G’是G的子图。子图实际上就是一张图里面小一点的图,也可以是点,不难理解。

图的结构-示意图

图常用来表示“多对多”的关系,如常说的:六度空间理论(Six Degrees Separation)

顶点(vertex)的属性:

  • 度数(degree),与该顶点相关联的总边数,一个图G的总度数d(V)等于总边数2倍:2E。当图的边具有方向时,一个顶点又分为出度(out-degree)和入度(in-degree),出度是以该顶点为起点的边数,入度是以该顶点为终点的边数。

  • 阶数(order),图G中顶点集V的大小为G的阶数。

边又称为线(line)或弧(arc),边(u,v)中表示u和v邻接(adjacent),(u, v) ∈ E,

边(edge)的属性:

一条边是一个顶点对(u,v),u, v ∈ V,按照图的顶点对是否有序,顶点对有序的图称为有向图(directed graph, digraph),此时边(u,v)和(v,u)是两条不同的边,顶点对无序的图称为无向图(undirected graph),此时边(u,v)和(v,u)是两条相同的边,无向图可看作一个特殊的有向图

具有成分的边包含:权(weight)、值(cost/value),此时图由可分为有权图(weighted graph)和无权图(unweighted graph),无权图可以看作是所有边权值相同的有权图

路径(path),一条路径是一个顶点序列u1, u2, u3, …, un,(ui, u(i+1)) ∈E,1<=i<n。路径长等于路径的边数:n-1,不包含边的路径长为0。

简单路径:路径上所有顶点互异,起点和终点可以相同

环或圈(cycle),此时u1=un,而且路径长至少为1,有向图(u,v)和(v,u)是一个圈,无向图(u,v)和(v,u)通常不被认为是一个圈。其中无圈图(acyclic graph)中没有圈,无圈有向图又称为DAG(directed acyclic graph)

  • 自环边(self loop),两个顶点都相同的边。

  • 重边或平行边(parallel edges),连接两个顶点的边数超过一条,又称为多重边(multiple edges)

连通图(connected graph),无向图中每个顶点到任意顶点都存在一条路径,连通的有向图称为强连通(strongly connected),非连通的有向图,去掉方向其基础图(underlying graph)是连通的,则成为弱连通的(weakly connected)

完全图(complete graph),图中任意一对顶点都存在一条边

稀疏图(sparse graph),每个顶点的度数较小的图

各种图形概念图解

图的基本基本概念

  • 顶点的度:无向图中连着顶点的边的数目。

  • 顶点的入度和出度:有向图中,以这个顶点为起点的边的数量称为这个顶点的出度;以这个顶点为终点的边称为这个顶点的入度。

  • 边权:边的费用,可以形象的理解为“过路费”。对于一张存在边权的图,我们称为“带权图”。

  • 连通:如果图中两点U,V之间存在一条由U经过若干边、点到达V的路径,则称U,V是连通的。

  • 回路:起点和终点相同的路径,称为“回路”或“环”。另外,不存在环的有向图称为Directed Acyclic Graph(DAG)。

  • 完全图:每个点都与其它所有的点有连边的图。

  • 无向图:图的边没有方向,可以双向。

  • 有向图:图的边有方向,只能按箭头方向从一点到另一点。

  • 网络:带权重的图

  • 连通:如果从v 到w存在一条(无向)路径,则称v和w是连通的

  • 路径:v到w的路径是一系列顶点的集合,其中任意一对相邻的顶点间都有图中的边。

  • 路径的长度:是路径中的边数(如果带权,则是所有边的权重和)。如果v和w之间的所有顶点都不同,则称简单路径

  • 连通图:图中任意两顶点都连通

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

  • 极大顶点数:再加一个顶点就不连通了

  • 极大边数:包含子图中所有顶点相连的所有边

  • 强连通:有向图中顶点v和w之间存在双向路劲,则称v和w是强连通的

  • 强连通图:有向图中任意两顶点均强连通

  • 弱连通图:不符合强连通图的条件,但是若是将边的方向都去掉,如果是连通的,则称为弱连通图

  • 强连通分量:有向图的极大强连通子图

图的简单应用

图的应用很广泛,这里举几个简单的例子。

  • 航空系统:顶点表示机场,边表示时间、距离或飞行的费用,一般最好有强连通的航空系统,另外常见的需求问题有:求任意两个机场的最佳航线。

  • 交通流:顶点表示街道的交叉口或红绿灯点,边表示速度限度或车辆容量,这时可以求最可能参数交通瓶颈的位置,或找出一条最短路。

  • 社交网络:顶点表示用户,用户的活动、推荐或好友代表边,这样可以表示一个完整的社交用户网络。

  • 电商推荐系统:顶点表示用户已浏览、收藏、购物过等相关的商品,边表示两个商品的相似性,可表示为有权图,权值为相似性的大小。

另外图论又可用于研究物理学和化学中的分子

图的遍历

  1. 深度优先搜索(Depth Firsh Search, DFS):走一步,看一步,走不通后返回到上一个能走通的结点

  2. 广度优先搜索(Breadth First Search, BFs):出队一个,访问一圈,访问的同时入队,相当于树的层序遍历(计划性非常强,个人感觉用这种遍历方式更好一些)

本系列主要讲二叉树,关于图,推荐阅读文章有:

转载本站文章《讲透学烂二叉树(一):图的概念和定义—各种属性特征浅析》,
请注明出处:https://www.zhoulujun.cn/html/theory/algorithm/TreeGraph/8281.html

免责声明:文章转载自《讲透学烂二叉树(一):图的概念和定义—各种属性特征浅析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java工具类Hutool超实用,神级框架值得拥有!/ Vijos FBI树 递归下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

4.1 无向图

一.图的表示 1.顶点的表示:使用整数0~V-1来表示。即使顶点是字母表示的,也可以利用符号表转换为顶点名字和整数一一对应的关系。 2.图的表示方法:实际中最常用的一种是邻接表数组(Adjaxency-list ) (1)使用数组表示以每一个顶点为索引的列表 (2)数组中的元素表示与该顶点邻接的顶点所构成的集合(这里使用ArrayList/bag来承载邻接...

有向图邻接矩阵的幂敛指数与周期【图论】

Description 定义有向图邻接矩阵A的周期为最小的d,使得存在正整数k,对于任意n>=k,都有(A^n=A^{n+d})最小的k称为A的幂敛指数。 现给出一个n个点,m条边有向图,求它的邻接矩阵的周期对10^9+7取模的结果。n<=100000,m<=200000 对于n<=200,m<=3000的数据,你还需要求出它...

点双连通分量与割点

前言 在图论中,除了在有向图中的强连通分量,在无向图中还有一类双连通分量 双连通分量一般是指点双连通分量 当然,还有一种叫做边双连通分量 点双连通分量 对于一个连通图,如果任意两点至少存在两条“点不重复”的路径,则说图是点双连通的(即任意两条边都在一个简单环中),点双连通的极大子图称为点双连通分量。 计算方法比较简单 在tarjan的过程中,如果由(i)...

点双连通分量

它是什么? 对于一个无向图,如果它没有割点,则称其为“点双联通图” 无向图的极大点双连通子图成为“点双连通分量” 它可以用来做什么? 如果对无向图中的所有点双连通分量缩点,可以得到一颗树,可以比较方便地将一些路径问题转化为树上问题 怎么求? 我们可以在(Tarjan)求割点时,顺便把所有(v-DCC)求出来,流程如下: 当一个节点第一次被访问时,入栈 当...

深度优先生成树及其应用

在上一篇博客判断有向图是否有圈中从递归的角度简单感性的介绍了如何修改深度优先搜索来判断一个有向图是否有圈。事实上, 它的实质是利用了深度优先生成树(depth-first spanning tree)的性质。那么什么是深度优先生成树?顾名思义,这颗树由深度优先搜索而生成的,由于无向图与有向图的深度优先生成树有差别,下面将分别介绍。 一. 无向图的深度优先生...

有向图传递闭包

目录 传递闭包的定义 有向图的传递闭包是Floyd warshall 算法的一种应用(主要参考算法导论) 传递闭包的定义 对于有向图G(V,E)的传递闭包即是G(V,E),其中E{(i,j):图G中包含一条由i到j的路径}。 Floyd warshall 传递闭包算法 Floyd warshall 代码 void floyd_warshall()...