图---面试知识点整理
有向无环图的拓扑排序可以看成图的层序遍历,每一层的顶点可以有不同的顺序,这就造成拓扑排序序列不唯一。
1.明白何为拓扑排序,其特点为什么? 以及排序结果是否唯一?
对一个 有向无环图 (Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。排序结果不唯一。
2.如何完成拓扑排序。
由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。
(1) 选择一个入度为0的顶点并输出之;
(2) 从网中删除此顶点及所有出边。
循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列
3.拓扑排序及应用。
拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。再进行多线程程序中可能会用到,将多线程单线程化
拓扑排序的步骤:
(1)、找到一个没有后继的顶点(如果有一条边从A指向B,那么B是A的后继)。
(2)、从图中删除这个顶点,在列表的前面插入顶点的标记。
(3)、重复步骤1和2.直到所有的顶点都从图中删除。这时列表显示的顶点顺序就是拓扑排序的结果。
环路:环图是不能进行拓扑排序的,如果有N个顶点的有向图有超过N-1条边,那么必定存在环。
将森林转换为对应的二叉树,若在二叉树结点中,结点m是结点n的双亲结点的双亲结点,则在原来的森林中,m和n可能具有的关系是____。
1.父子关系
3.兄弟关系
结点m是结点n的双亲结点的双亲结点有4种情况
1) m 2)m 3)m 4)m
/ / \ \
/ \ / \
n n n n
爷爷 父子 叔侄(关系2) 兄弟
用顶点表示事件,用弧表示活动,弧的权值表示活动所需要的时间,用这种方式构造的有向无环图叫做边表示活动的网(Activity On Edge Network),简称AOE-网
在AOE-网中存在惟一的、入度为0的顶点,叫做源点;存在惟一的、出度为0的顶点,叫做汇点。从源点到汇点的最长路径的长度即为完成整个工程任务所需的时间,该路径叫做关键路径。关键路径上的活动叫做关键活动。
关键活动延期完成 ,必将延期整个工程完成时间。如果有多条关键路径,此时延期的关键活动所在路径成为关键路径,其他原关键路径变为非关键路径。
关键活动提前完成,不一定使整个工程提前完成。因为关键路径可能不唯一,一条路径上的关键活动提前,只能使这条路径变为非关键路径,其他关键路径不受影响。
工作最迟开始时间LSii(LatestStartTime)——是指在不影响整个任务按期完成的前提下,本工作必须开始的最迟时刻。工作的最迟开始时间等于工作最迟完成时间与其持续时间之差。
工作最早开始时间ESii(EarliestStartTime)——是指在其所有前面工作全部完成后,本工作有可能开始的最早时刻。
关键路径,AOE网中,从事件i到j的路径中,加权长度最大者称为i到j的关键路径,显然,关键路径决定着AOE网的工期,关键路径的长度就是AOE网代表的工程所需的最小工期。
关键活动,若活动ak的最大可利用时间等于0(即(l(k)=e(k)),则称ak 为关键活动,否则为非关键活动。 显然,关键活动的延期,会使整个工程延期。但非关键活动不然,只要它的延期量不超过它的最大可利用时间,就不会影响整个工期。换句话说,即关键活动一定位于关键路径上。
BFS是广度优先遍历,DFS是深度优先遍历。对于一些特殊的图,比如只有一个顶点的图,其BFS生成树的树高和DFS生成树的树高相等。一般的图,根据图的BFS生成树和DFS树的算法思想,BFS生成树的树高比DFS生成树的树高小。
DFS深度优先遍历从一个顶点出发:依次对访问过的顶点做标记,并寻找没有访问过的相邻顶点,找直接相连的点,依次找,找到尽头时,再往回溯。
对于DFS,BFS遍历来说,时间复杂度和存储结构有关:
1.若采用邻接矩阵存储,时间复杂度为O(n^2);
2.若采用邻接链表存储,时间复杂度为O(n+e);
若所有边的长度相等,广度优先搜索算法是最佳解——亦即它找到的第一个解,距离根节点的边数目一定最少;但对一般的图来说,BFS并不一定回传最佳解。这是因为当图形为加权图(亦即各边长度不同)时,BFS仍然回传从根节点开始,经过边数目最少的解;而这个解距离根节点的距离不一定最短。这个问题可以使用考虑各边权值,BFS的改良算法 成本一致搜寻法 ( en:uniform-cost search )来解决。然而,若非加权图形,则所有边的长度相等,BFS就能找到最近的最佳解。
n个顶点的连通图至少有n-1条边,再少就不连通了,连通是指任意两个顶点之间都有路径,而不要求都有边相连.有路径是指从一个顶点沿着某些边可以到达另一个顶点。
无向连通图最少边为n-1,最多边为n*(n-1)/2
n个顶点,m条边的全连通图,至少去掉几条边才能构成一棵树?
n个顶点的树一定有n-1条边,所以需要去掉m-(n-1)=m-n+1条边
有n个顶点的强连通图 最多有n(n-1)条边,最少有n条边。
解释如下:
强连通图 (Strongly Connected Graph)是指一个有向图(Directed Graph)中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径的图。
最多的情况:
即n个顶点中两两相连,若不计方向,n个点两两相连有n(n-1)/2条边,而由于强连通图 是有向图,故每条边有两个方向,n(n-1)/2×2=n(n-1),故有n个顶点的强连通图最多有n(n-1)条边。
最少的情况:
即n个顶点围成一个圈,且圈上各边方向一致,即均为顺时针或者逆时针,此时有n条边。
对于具有e条边的无向图,它在邻接表中有2e个边节点。对于任意一条边,在邻接表表示时都需要表示两次,每次都涉及两个节点。
表节点应该包括顶点表节点和边表结点。n个顶点的无向图有n个顶点表节点,n个顶点的无向图最多有n*(n-1)/2条边, 在邻接表中每条边存储两次,所以边表结点有n*(n-1)个结点,所以表节点有n+n*(n-1)=n^2个。
有向图中顶点V的度等于其邻接矩阵中行表示出度,列表示入度。度等于出度加入度。
在 无向图 中,如果从顶点vi到顶点vj有路径,则称vi和vj连通。如果图中任意两个顶点之间都连通,则称该图为 连通图 ,否则,称该图为非连通图,则其中的极大连通子图称为连通分量,这里所谓的极大是指子图中包含的顶点个数极大。
有向完全图:图中各边都有方向,且每两个顶点之间都有两条方向相反的边连接的图。
n个结点的完全有向图含有边的数目:n*(n-1)
无向图的顶点个数为n,则该图最多有n*(n-1)/2条边
一个带权的无向连通图的最小生成树的权值之和是唯一的。树不唯一,权值之和唯一。
十字链表是有向图的一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。
邻接表存储有向图时,所需空间为:8*(V+1)+8*m
邻接表存储无向图时,所需空间为:8*(V+1)+8*m*2
所以与顶点数和边数均有关