一些 NOIP 常用算法的时间复杂度

版权声明:本页面的全部内容在 CC BY-SA 4.0 之条款下提供,附加条款亦可能应用 https://blog.csdn.net/qq_18946671/article/details/83537120

一些 NOIP 常用算法的时间复杂度

参考资料:算法进阶指南第2版(刚才上网查了一下,https://www.zhihu.com/question/40990125 ,好像不会有版权问题,如果有版权问题,可以评论里说一下,如果我看到会尽快处理)

图论算法

n = V , m = E . n=|V|,m=|E|.

搜索

用邻接表存图:

算法 时间复杂度
DFS、BFS O ( m n ) O(mn)

用邻接矩阵存图:

算法 时间复杂度
DFS、BFS O ( n 2 ) O(n^2)

最短路

单源最短路径

要求所有边的长度为非负数
算法 时间复杂度
Dijkstra 算法 O ( n 2 ) O(n^2)
堆优化的 Dijkstra 算法 O ( ( m + n ) lg n ) O((m+n)\lg{n})
适用于所有有向图
算法 时间复杂度
Bellman-Ford O ( m n ) O(mn)
SPFA 最坏 O ( m n ) O(mn) ,但大多数情况下很快

任意两点间最短路

算法 时间复杂度
Folyd 算法 O ( n 2 ) O(n^2)

树相关

最小生成树

算法 时间复杂度
Kruskal 算法 O ( m lg m ) O(m\lg{m})
Prim 算法 O ( n 2 ) O(n^2)
堆优化的 Prim 算法 O ( m lg n ) O(m\lg{n})

LCA

算法 时间复杂度
倍增 初始化: O ( n lg n ) O(n\lg n) ,查询: O ( 1 ) O(1)
基于 ST 表的算法 初始化: O ( n lg n ) O(n\lg n) ,查询: O ( 1 ) O(1)

DP

背包问题

01背包问题

O ( V N ) O(VN)

其它:待填坑

数据结构

并查集

设最开始有 n n 个集合。
路径压缩优化后:

操作 时间复杂度
合并两个集合 O ( α ( n ) ) O(\alpha(n))
查询元素所在集合 O ( α ( n ) ) O(\alpha(n))

树状数组

设原数组有 n n 个元素。
单点修改、区间求和:

操作 时间复杂度
单点修改 O ( n lg n ) O(n\lg n)
区间求和 O ( n lg n ) O(n\lg n)

区间加减、单点查询(将原数组的差分数组进行单点修改、区间求和操作):

操作 时间复杂度
区间加减 O ( n lg n ) O(n\lg n)
单点查询 O ( n lg n ) O(n\lg n)

线段树

线段树常数比较大。

操作 时间复杂度
单点修改 O ( n lg n ) O(n\lg n)
区间求和、求最值 O ( n lg n ) O(n\lg n)
区间加减 O ( n lg n ) O(n\lg n)
单点查询 O ( n lg n ) O(n\lg n)

ST表

初始化: O ( n lg n ) O(n\lg n)
区间求最值: O ( 1 ) O(1)

猜你喜欢

转载自blog.csdn.net/qq_18946671/article/details/83537120