目录
总结
广度优先遍历BFS | 深度优先遍历DFS | |
---|---|---|
邻接表存储 | ![]() | ![]() |
邻接矩阵存储 | ![]() | ![]() |
普里姆算法能 | 迪杰斯特拉算法 | |
---|---|---|
时间复杂度 | | |
一、BFS算法的性能分析
遍历图的过程实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所用的存储结构
1.空间复杂度
无论是邻接表还是邻接矩阵的存储方式,BFS算法都需要借助一个辅助队列Q,n个顶点均入队一次,在最坏的情况下,空间复杂度为O(V)。
2.时间复杂度
采用邻接表存储方式时,每个顶点均需搜索一次(或入队一次),故时间复杂度为0(V),在搜索任一顶点时,顶点后边的链表都要访问一次,在搜索完V个顶点后,边表也就都访问了,故时间复杂度为O(E),算法总的时间复杂度为O(V+E)。
采用邻接矩阵存储方式时,查找每个顶点的邻接点所需的时间为0(V),查找每个节点的边所需的时间还是O(V),故算法总的时间复杂度为
二、DFS算法的性能分析
遍历图的过程实质上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所用的存储结构
1.空间复杂度
DFS算法是一个递归算法,需要借助一个递归工作栈,故其空间复杂度为O(V)。
2.时间复杂度
以邻接表表示时,查找所有顶点的邻接点所需的时间为O(E),访问顶点所需的时间为O(V),此时,总的时间复杂度为O(V+E)。
以邻接矩阵表示时,查找每个顶点的邻接点所需的时间为0(V),故总的时间复杂度为
三、 Prim (普里姆)算法的性能分析
Prim (普里姆)算法时间复杂度
prim算法是以点为主要对象展开的算法,算法结束后需要找到n个点。从一个点出发,找n-1次,将这n个点都找到。那么时间复杂度就是O(n*(找到最短距离那个点所需的时间))。
接下来讨论如何找到最短距离那个点。prim算法找点的过程与Dijkstra (迪杰斯特拉)算法类似,思路如下:
我们知道,prim算法将所有的点分为两个集合,一个是已经找到的点构成的集合U,另一个是未找到的点构成的结合UE。开始的时候U中有一个点,然后我们准备一个数组A,用来初始化UE中的点到U中的点的最短距离,初始化完毕后就可以开始prim算法了。伪代码如下:
for(v:所有的点){
if(v 不属于 U){
判断A[v]是不是最短的边
}
}
更新v加入A后,其它点通过v到U的最短距离,也就是更新A数组
上述代码执行完毕后就找到了最短的边,即找到最短距离那个点所需的时间是n。
所以Prim (普里姆)算法时间复杂度是
四、Dijkstra迪杰斯特拉算法的性能分析
Dijkstra迪杰斯特拉算法时间复杂度
Dijkstra算法是从源点开始,找n-1次,每次找到一个距离
距离最短的点(已经找到的点忽略)。那么他的时间复杂度就是O(n*(一次找到距离
最近的点的时间))。
关于没找到的点和已经找到的点我们这样考虑,将已经找到的点放入集合U,未找到的点放入集合UE。
初始时准备两个数组,数组dis用来存放其余n-1个点到的距离;
初始化,将放入集合U。然后在dis中寻找一个距离
最短距离的点
,将
放入集合U。更新数组dis,更新规则是,通过
,其余n-2个点距离
更近了。
通过上述内容,可以知道一次找到距离最近的点的时间就是遍历一次数组dis,找到最小值,其时间复杂度为O(n)
所以Dijkstra算法的时间复杂度为O()