目录
P38-P39笔记
视频地址👇
http:www.bilibili.com/video/BV1Fv4y1f7T1?p=38&vd_source=02dfd57080e8f31bc9c4a323c13dd49c
认识:图
继树这种表示层次数据的非线性结构之后,今天我们认识图——一种表示对象之间任意的关联关系的非线性结构。
可以说树是一种特殊的图。我们知道树是自上到下像树根一样发散的,除了根节点,每个节点都有一个父节点,并且从根节点到任意一个节点有且只有一条路径(在树里好像不经常提到这个特点),有n个节点的话,就会有n-1条边。
但是对于图来说,没有这么多限制,图由一组点集和一组边集构成,边可以任意的连接节点,从一个节点到另一个节点可能有多条路径,也可能没有路径,点和边的数量没有固定的关系。
以上,图可以被定义为:一个图G由顶点集V(G)和边集E(G)组成,记 G = (V ,E)。
就像这样👇
图的一些名词
有序对:当G = (V ,E),第一个对象表示的是点集,第二个对象表示边集,这样就叫有序对,用小括号表示。 (a,b)和(b,a)是不同的。反之为无序对,即{a,b}和{b,a}表示的结果是一样的,我们用花括号表示。
边的分类:1.有向边:两个点之间的链接是单向的。就像之前学的树,其链接就是单向的边。2.无向边:两点之间的链接是双向的
左图为有向边,其可以表示为一个有序对,就像从一个起点到一个终点,从u到v和从v到u是不同的;右边为无向边,可用无序对表示。
一个图中所有的边要么都是有向的,要么都无向,我们暂时不讨论两者混合的图。
我们使用 |E| |V|来表示边/顶点的数量。
图的类型
有向图/无向图:一个图中所有的边都为有向边时,该图为有向图,反之即为无向图。
加权图: 有时候,在一个图中不同的边所具有的权重不同,不能同等看待。我们可以把所有图都看作加权图,非加权图就相当于每条边权重一样的图嘛。
简单图:一个不包含自环和多重边的图。
完全图:边数达到最大的图。类比完全二叉树。
连通图:图中任意两个节点都是连通的。从一个点一定可以到达图中的其他任意一点。
无环图:一个没有循环(回路)的图。树就是一个例子。
带权连通图一般称为网
图的属性
顶点的度:
在无向图中,顶点的度就是与该顶点相关联的边的数目。
在有向图中,顶点的度分为入度和出度。补充:有向图中的边可称为弧,初始点称为弧尾,终端点称为弧头。
入度是:以该顶点为弧头的弧的数目。
出度是:以该顶点为弧尾的弧的数目。
自环:
一个节点与自己进行链接,边所连接的两个顶点是一个点。同一个节点既是起点也是终点。应用:比如:刷新功能(感觉一下清晰了hh)
多重边:
两个节点之间有重复的边。
应用:比如: 各种交通工具从一个起始地到目的地的班次,一天会有好几班这样,不同班次有不同的名称也会有不同的耗费等等。
简单图边数:
边集可以为空,几个单独的节点也是图,所以最小边数是0;当该图为有向图,每两个节点之间可以互相链接,如下图
如果有四个顶点,每个顶点可以与其他三个顶点都进行链接,且不担心重复,因为有向。所以如果该图是有向图,那么其最大边数应该是顶点数n*(n-1) 。如果是无向图,每两个点之间的两条链接都被简化为一条无向边。因此如果是无向图,其最大边数应该是顶点数n*(n-1)/2
我们可以看到在图中,边的数量远远大于顶点数量,最大基本要达到其顶点数的平方了,这种图我们称为稠密的,如果其边数接近顶点数,那么称之为稀疏的。
根据图的稀疏还是稠密,我们可能会采用不同的存储方式,稀疏采用邻接表存储,稠密使用邻接矩阵存储。这些之后再说。
路径:
是图中一个顶点的序列,且序列中两个相邻节点通过一条边进行链接。在有向图中,路径中所有的边必须和路径方向保持一致。
最短路径:
如果序列中没有一个顶点是重复的,顶点不重复也说明边是没有重复的,那么该路径就称其为最短路径。
我们经常称简单路径直接为路径path,默认其没有重复的边和顶点。而用途径来表示非最短路径。trail用来表示顶点可以重复边不能重复的路径。
连接性:
有向图为强连接,无向图为连接。如果一个有向图各个顶点不互通,但是如果将其变为无向图其各个顶点又相连,那么称其为弱连接的。
闭回路:
一个途径的起点和终点为同一个点,途径长度大于0,也就是走成一个闭环,这个闭环就叫闭回路。
环:
是指简单的闭回路,即没有重复的边和顶点
环涉及到从一个顶点到另一个顶点的最短路径设计问题。
图的一些应用
图可以用来表示具有某种组合对关系的对象的集合。
例1:社交关系网
一个节点代表一个用户, 如果两个用户是朋友就会有边将他们链接起来。社交关系网是一个无向图,因为我们互相为对方的朋友,链接应该是双向的。
我们如果想给我介绍一些朋友,一种方式是可以把我的朋友的未和我进行链接的朋友介绍给我(感觉有点像热传递hh)。下图以Rama为例。
这个问题在图的术语中, 是如何找到从Rama开始的最短路径长度为2的所有节点。这是个标准的图的问题。
例2:相互链接的网页
这个应用就比较多了,小到在这篇文章中我所引用放置的链接,ppt里的超链接,大到我们该网站上点击不同的模块会跳转不同的内容一样等等都是。 我们从一个网页到另一个网页,在另一个网页上不一定会有回到原网页的链接,我们该ppt跳转到其他ppt,未必有返回的链接,因此这属于有向图。
网络爬虫是一种标准的图论算法,也就是图的遍历:访问一个图中的所有节点。(突然蹦出来个好像很高深的技术哈哈哈)
例3:城际道路网络
城际道路我想象成高速公路,基本都是双向的,即无向图。 如果要从一个节点到达另一个节点,我们不仅要考虑边的数量,同时也要计算每边权重之和来确定总的成本,才能确定最短路径是哪条。在一个有权图中,从一个节点到另一个节点的最短路径通常是指权重之和最小的路径。
在城内道路,可能是有单向的,是可以被建模成有向图的。视情况而定
好啦,先写到这。
如果有哪里出现错误的说法欢迎指出,非常感谢。
也欢迎交流建议奥。