图的基本算法(一、图的表示)

来源:互联网 发布:js class 空格 编辑:程序博客网 时间:2024/06/14 03:25

—————————————————————————————————————————————————

搜索一个图是有序地沿着图的边访问所有顶点

G(V, E), V用来表示图中的顶点, E用来表示图中的边;

—————————————————————————————————————————————————

当图为稀疏图(E 远小于 V^2)时用邻接表表示法比较紧凑;

若是稠密图时,则通常用邻接矩阵; 亦或者是在需要很快的判断出两个顶点是否在链接边时,通常也用邻接矩阵;

—————————————————————————————————————————————————

如果G 是一个有向图,则所有邻接表的长度之和为E, 如果是无向图,则为2E;

无论是有向抑或是无向,邻接表所需的存储空间为Θ(V + E);

 

一个图的邻接矩阵表示需要占用Θ(V^2)的存储空间,与图的边数无关;

—————————————————————————————————————————————————

练习:给定一个有向图的邻接表表示,计算图中每个顶点的出度与入度分别都需要Θ(E + V)的时间;

—————————————————————————————————————————————————

练习:有向图G = (V, E),其转置为G^T = (V, E^T),G^T 就是将 G中所有的边反向后形成的图; G 到G^T 的有效算法的时间为?

如果表示该图的是邻接矩阵,则需要遍历完整个矩阵即可,即需要时间为: Θ(V^2);将原本的行改为列

如果表示该图的是邻接表,则也是遍历完即可,即需要时间为:Θ(V + E);当在某个顶点a的链表中发现有顶点b,则在新的邻接表中的b链表中加入a即可;

—————————————————————————————————————————————————

练习:有向图G = (V, E)的平方是图 G^2 = (V, E^2),亦即,如果图中顶点U 和 W 之间存在着一条恰好包含两条边的路径时,则G^2 必包含该边(U , W),请针对图G 的两种表示方法,计算能算出图G^2的表示方法是时间复杂度?

如果是用邻接矩阵A表示图G, 则可以通过计算A^2 即可得到 G^2,即通过“与”和“或”的操作即可完成,所需的计算步奏为n^3(因为计算一个点时,需要做n 次的乘法与 n 次的加法,而一共需要计算n^2个点,所以共需Θ(n^2(n + n) = Θ(n^3))),但是如果用到了“Strassen algorithm”算法,可以将时间复杂度降为 O(nlog 7) = O(n2.81)

如果是用邻接表A表示图G,则我们先假设有两个邻接表A 与 B, 对于A 中的每个顶点的链表中的每个节点C用在表B中C顶点的链表表示,并将之融合为一体,因为链表的长度最长为V , 所以,每次的融合的时间复杂度为:Θ(V),因为有向图邻接表的存储空间为Θ(E + V), 故所以最终的时间复杂度为:Θ((E + V)* V)=Θ(EV + V^2)

—————————————————————————————————————————————————

 练习:当采用邻接矩阵表示时,很多算法的复杂度为Θ(v^2),试证明可以在Θ(V)内确定是否包含一个“通用的汇”,即其入度为V-1,出度为0?

例如在矩阵A 的某一行中,有六个0,四个1,(先假设不存在自己到自己)则我们可以接下来只去判断那4个1所对应的行是否全为0即可;

**********算法思想是:对于两个顶点U,V,如果存在着边U->V,则U不符合,若没有这样的边则V不符合;例如:1、2、3、4、5五个顶点,从1开始,如果存在着1->2 的边则1不符合,否则2不符合,故能排除一个顶点;接下来(假设排除了1),我们考虑是否有边2->3的存在,又可以淘汰一个,以此类推即可排除是否存在这样的点了;所以共需Θ(V)时间;

—————————————————————————————————————————————————

 

 

原创粉丝点击