【初赛】时间复杂度 空间复杂度

时间复杂度

  • O(1)

  • O(n)

  • O(log n):

         for(int i=k;i<=n;i+=k)
    
  • O(log log n):
    (ps.这个好像不太对哦。

        for(int i=k;i<=n;i+=k)
            for(int j=k;j<=k;j+=l)
        ```
        
    
  • O(n log log n):典型代表是线性筛素数算法

tips:

\( \log \log n !=\log^2 n\\ \log^2 n=\log n\times \log n \)

邻接矩阵

查询是否存在某条边:\(O(1)\)
遍历一个点的所有出边:\(O(n)\)
遍历整张图:\(O(n^2)\)
空间复杂度:\(O(n^2)\)

邻接表 vector

遍历整张图:O(n+m)。
空间复杂度:O(m)。

链式前向星

遍历整张图:O(n+m)。
空间复杂度:O(m)。

DFS

时间复杂度为 O(n+m)
空间复杂度为 O(n),

BFS

时间复杂度 O(n+m)
空间复杂度 O(n)(vis 数组和队列)

倍增LCA

倍增算法的预处理时间复杂度为 O(n log n),单次查询时间复杂度为 O(log n)。

树链剖分

预处理时间复杂度为 O(n),单次查询时间复杂度为 O(log n)。

拓扑

时间复杂度 O(E+V)

Floyd

时间复杂度:\(O(n^3)\)
空间复杂度:\(O(n^2)\)

dij

时间 O(m log n)

tarjan

时间复杂度 O(n + m)

链表

因其链状的结构,能方便地删除、插入数据,操作次数是
O(1)。但也因为这样,寻找、读取数据的效率不如数组高,在随机访问数据中的操作次数是
O(n)。

数组可以方便地寻找并读取数据,在随机访问中操作次数是
O(1)。但删除、插入的操作次数是
O(n) 次。

并查集

在不进行任何优化的情况下,最坏情况下的时间复杂度为 \(O(n)\)

只使用启发式合并,而不使用路径压缩,时间复杂度为 \(O(m\log n)\)

不使用启发式合并、只使用路径压缩的最坏时间复杂度是 \(O (m \log n)\)

查询和合并的时间复杂度为 \(O(\log_2n)\)

\(O(n)\) 读音: big-oh; 表示\(\color{red}{上界,小于等于\leq}\).

\(\Omega(n)\) 读音: big omega、欧米伽; 表示\(\color{red}{下界,大于等于\geq}\)

\(\Theta(n)\) 读音: theta、西塔:既是上界也是下界,称为确界,等于.

\(o(n)\) 读音: small-oh; 表示上界,小于。

\(\omega(n)\) 读音: small omega; 表示下界,大于。

\(O\) 是渐进上界,\(\Omega\) 是渐进下界。\(\Theta\) 需同时满足大 \(O\)\(\Omega\) ,故称为确界。

\(O\)极其有用,因为它表示了最差性能

P问题:
一个问题可以在多项式 \(O(n^k)\)的时间复杂度内解决。

NP问题:
一个问题的解可以在多项式的时间内被验证

NP-hard问题:
任意NP题都可以在多项式时间内归约为该问题,但该问题本身不一定是NP问题。归约的意思是为了解决问题A,先将问题A归约为另一个问题B,解决问题B同时也间接解决了问题A。

NPC问题:
既是NP问题,也是NP-hard问题。

空间复杂度

转载自

空间复杂度全称就是渐进空间复杂度,用来表示算法的存储空间与数据规模之间的增长关系。和时间复杂度一样,空间复杂度也是用大 O 进行表示。

其实学会了分析时间复杂度,那么空间复杂度的分析就简单了,主要就看我们在一个算法当中到底有没有使用到了额外的空间来进行存储数据,然后判断这个额外空间的大小会不会随着 n 的变化而变化,从而得到空间复杂度。

我们来看一个给数组赋值例子,假设这就是一个算法,我们可以来分析下这个算法的空间复杂度:

public static void init(int n){
    int a = 0;
    int arr[] = new int[n];
    for (int i=0;i<n;i++){
        arr[i]=n;
    }
}

一开始定义了一个变量,这里需要空间,但是这是一个常量级的(不随 n 的变化而变化),然后再定义了一个数组,数组的长度为 n,这里数组也需要占用空间,而且数组的空间是随着 n 的变化而变化的,其余代码没有占用额外空间,所以我们就可以认为上面示例中的空间复杂度为 O(n)

对于算法的空间复杂度也可以简单的进行总结一下:

  • 如果申请的是有限个数(常量)的变量,空间复杂度为 O(1)
  • 如果申请的是一维数组,队列或者链表等,那么空间复杂度为 O(n)
  • 如果申请的是二维数组,那么空间复杂度为 O(n²)
  • 如果是在循环体中申请的数组等,可能就需要取嵌套的乘积来作为空间复杂度,这种就需要具体的进一步分析。
posted @ 2025-09-11 09:03  Slayer-WT!!!!!!!!  阅读(13)  评论(0)    收藏  举报