数据结构中算法复杂度总结

目录

总结

一、BFS算法的性能分析

1.空间复杂度

2.时间复杂度

二、DFS算法的性能分析

1.空间复杂度

2.时间复杂度

三、 Prim (普里姆)算法的性能分析

Prim (普里姆)算法时间复杂度

四、Dijkstra迪杰斯特拉算法的性能分析

Dijkstra迪杰斯特拉算法时间复杂度


总结

BFS和DFS时间复杂度
广度优先遍历BFS深度优先遍历DFS
邻接表存储O(V + E)O(V + E)
邻接矩阵存储O(V^{2})O(V^{2})
最小生成树算法时间复杂
普里姆算法能迪杰斯特拉算法
时间复杂度

 O(V^{2})

 O(V^{2})

一、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算法是从源点v_{0}开始,找n-1次,每次找到一个距离v_{0}距离最短的点(已经找到的点忽略)。那么他的时间复杂度就是O(n*(一次找到距离{\color{Magenta} v_{0}}最近的点的时间))。

关于没找到的点和已经找到的点我们这样考虑,将已经找到的点放入集合U,未找到的点放入集合UE。

初始时准备两个数组,数组dis用来存放其余n-1个点到v_{0}的距离;

初始化,将v_{0}放入集合U。然后在dis中寻找一个距离v_{0}最短距离的点v_{1},将v_{1}放入集合U。更新数组dis,更新规则是,通过v_{1},其余n-2个点距离v_{0}更近了。

通过上述内容,可以知道一次找到距离{\color{Magenta} v_{0}}最近的点的时间就是遍历一次数组dis,找到最小值,其时间复杂度为O(n)

所以Dijkstra算法的时间复杂度为O({\color{Blue} n^2})

  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eva_5433

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值