时间复杂度

· · 算法·理论

时间复杂度速查表(基于现代CPU 1s算力)

数据规模 (n) 可接受复杂度 典型算法与应用场景 理论计算量参考 (1s)

n ≤ 20\hspace{1cm} O(2ⁿ), O(n!)\hspace{0.1cm}$ 全排列、暴力搜索 $\hspace{0.8cm}10⁶ n ≤ 40\hspace{1cm} O(n2ⁿ)\hspace{0.93cm}$ 状态压缩DP $\hspace{1.6cm}10⁷ n ≤ 100\hspace{0.8cm} O(n³)\hspace{1.2cm}$ Floyd、朴素动态规划 $\hspace{0.35cm}10⁶ n ≤ 1,000\hspace{0.3cm} O(n²), O(n²logn)$ 二维DP、Dijkstra $\hspace{0.55cm}10⁶ n ≤ 10⁴\hspace{0.7cm} O(n\sqrt{n})\hspace{0.9cm}$ 分块、莫队算法 $\hspace{1.1cm}10⁶ n ≤ 10⁵\hspace{0.7cm} O(nlogn)\hspace{0.75cm}$ 线段树、二分答案 $\hspace{0.8cm}10⁶ n ≤ 10⁶\hspace{0.7cm} O(n)\hspace{1.4cm}$ KMP、滑动窗口 $\hspace{1.1cm}10⁶ n ≤ 10⁷\hspace{0.7cm} O(n)\hspace{1.35cm}$ 需严格IO优化 $\hspace{1.45cm}10⁷ n ≤ 10⁹\hspace{0.7cm} O(\sqrt{n}), O(1)\hspace{0.2cm}$ 数学推导 $\hspace{2cm}10⁵ n ≤ 10¹⁸\hspace{0.55cm} O(logn)\hspace{0.9cm}$ 快速幂、矩阵快速幂 $\hspace{0.65cm}50

案例研究:区间最大和问题(洛谷P5745)

问题描述:在长度为n的数列中寻找和不超过M的最大连续子区间。

解法演进与性能对比

1. 暴力法(O(n³))

for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++)
        for(int k=i;k<=j;k++)
            sum += a[k];

2. 前缀和(O(n²))

for(int i=1;i<=n;i++) s[i] = s[i-1]+a[i];
for(int i=1;i<=n;i++)
    for(int j=i;j<=n;j++)
        sum = s[j]-s[i-1];

3. 二分法(O(nlogn))

for(int i=1;i<=n;i++){
    int j = upper_bound(s+i,s+n+1,s[i-1]+M)-s-1;
    sum = s[j]-s[i-1];
}

4. 滑动窗口法(O(n))

int l=1, r=1;
while(l<=n){
    while(r<=n && sum+a[r]<=M) sum+=a[r++];
    update_answer();
    sum-=a[l++];
}

性能对比表格

解法\hspace{0.35cm} 3000数据\hspace{0.35cm} 10⁴数据\hspace{0.35cm} 10⁵数据\hspace{0.35cm} 4×10⁶数据

O(n³)\hspace{0.25cm}>10s\hspace{1.15cm} 超时\hspace{1.1cm} 超时\hspace{1.1cm} 超时 O(n²)\hspace{0.35cm} 16ms\hspace{1.17cm} 142ms\hspace{0.8cm} 12s\hspace{1.3cm} 超时 O(nlogn)\hspace{0.1cm} 3ms\hspace{1.05cm} 4ms\hspace{1.15cm} 16ms\hspace{1cm} 645ms O(n)\hspace{0.7cm} 3ms\hspace{1.15cm} 3ms\hspace{1.15cm} 5ms\hspace{1.15cm} 162ms

竞赛优化技巧

IO优化模板

inline int read(){
    int x=0; char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x;
}

效果对比

复杂度预判 编码前估算最大数据量下的计算次数

避免vector<bool>,减少模运算

备用方案:准备随机化算法,编写部分分特判

可视化工具推荐: Desmos复杂度分析

可直观比较不同算法在n增长时的表现差异

通过系统性的复杂度分析和渐进式优化,可以在竞赛中高效稳定地获得高分。建议在训练时建立自己的"时间复杂度-算法"映射表,提升解题效率。