时间复杂度

这种题目是数据结构与算法考研(如408)或面试中的高频送分题 ,但也是高频陷阱题

复习这类题目,不要靠"猜"或者"死记硬背",而是要掌握一套**"数学建模"**的方法。一旦你建立了数学直觉,这类题看一眼就能选出答案。

以下是我总结的复习经验、技巧和核心知识点体系:


一、 核心复习心法:拒绝"直接相乘",学会"级数求和"

很多同学做错这道题(选C O(nlog⁡n)O(n \log n)O(nlogn)),是因为用了错误的直觉:

"外层循环看起来是 log⁡n\log nlogn 次,内层循环看起来是 nnn 次,乘起来就是 nlog⁡nn \log nnlogn。"

❌ 错误原因 :当内层循环的次数 j < i 依赖于 外层循环变量 i 时,绝对不能直接相乘 !必须把每次循环的次数写出来,进行求和


二、 三大经典模型(必背)

在复习时,你只需要把这三种最常见的循环模型搞定,90%的题目都能解决。

模型 1:等差数列模型(结果是 O(n2)O(n^2)O(n2))

特征 :外层线性增长(i++),内层依赖外层(j < i)。

c 复制代码
for (int i = 0; i < n; i++) {      // 0, 1, 2, ..., n
    for (int j = 0; j < i; j++) {  // 内层执行 i 次
        // ...
    }
}
  • 数学分析
    第1次执行0次,第2次执行1次......第n次执行 n−1n-1n−1 次。
    总次数 S=0+1+2+⋯+(n−1)S = 0 + 1 + 2 + \dots + (n-1)S=0+1+2+⋯+(n−1)。
    这是等差数列求和 ,公式是 n(n−1)2\frac{n(n-1)}{2}2n(n−1),最高次项是 n2n^2n2。
  • 结论O(n2)O(n^2)O(n2)
模型 2:等比数列模型(你的这道错题,结果是 O(n)O(n)O(n))

特征 :外层指数增长(i *= 2),内层依赖外层(j < i)。

c 复制代码
for (int i = 1; i < n; i *= 2) {   // 1, 2, 4, 8, ...
    for (int j = 0; j < i; j++) {  // 内层执行 i 次
        // ...
    }
}
  • 数学分析
    iii 的取值序列是 1,2,4,8,...,2k1, 2, 4, 8, \dots, 2^k1,2,4,8,...,2k (其中 2k<n2^k < n2k<n)。
    总次数 S=1+2+4+8+⋯+2kS = 1 + 2 + 4 + 8 + \dots + 2^kS=1+2+4+8+⋯+2k。
    这是等比数列求和 (公比为2)。
    记忆技巧 :在二进制世界里,等比数列的和 ≈\approx≈ 最后一项乘以2
    所以 S≈2⋅2kS \approx 2 \cdot 2^kS≈2⋅2k。因为 2k2^k2k 接近 nnn,所以总和接近 2n2n2n。
  • 结论O(n)O(n)O(n)
模型 3:独立对数模型(结果是 O(nlog⁡n)O(n \log n)O(nlogn))

特征 :外层线性增长(i++),内层不依赖 具体数值,而是固定倍增(j *= 2)。

c 复制代码
for (int i = 0; i < n; i++) {       // 执行 n 次
    for (int j = 1; j < n; j *= 2) { // 每次都执行 log n 次
        // ...
    }
}
  • 数学分析
    外层固定跑 nnn 次。
    内层每次都跑 log⁡2n\log_2 nlog2n 次(和 iii 无关)。
    这是真正的"直接相乘"场景。
    总次数 S=n×log⁡2nS = n \times \log_2 nS=n×log2n。
  • 结论O(nlog⁡n)O(n \log n)O(nlogn)

三、 解题通用步骤(复习操作指南)

考试遇到任何看不准的题,按这三步走:

第一步:列出 iii 的变化序列

不要只看 for,要在草稿纸上写出 iii 具体变成了多少。

  • 例题中:i=1,2,4,8,16,...i = 1, 2, 4, 8, 16, \dotsi=1,2,4,8,16,...

第二步:写出每一步内层语句执行的次数

  • 例题中:当 i=1i=1i=1 执行1次,当 i=2i=2i=2 执行2次,当 i=4i=4i=4 执行4次......

第三步:列式求和并判断量级(最关键)

  • 式子:1+2+4+⋯+最后一项1 + 2 + 4 + \dots + \text{最后一项}1+2+4+⋯+最后一项。
  • 判断技巧
    • 如果是 1+2+3... (均匀增加),总量级是最后一项的平方 -> O(n2)O(n^2)O(n2)。
    • 如果是 1+2+4... (越加越大,成倍增加),总量级由最后一项 决定(前面的加起来都没最后一项大),直接看最后一项是谁 -> O(n)O(n)O(n)。
    • 如果是 n + n/2 + n/4... (越加越小),总量级由第一项 决定 -> O(n)O(n)O(n)。

四、 避坑经验总结

  1. 看到 i *= 2 别急着选 log⁡n\log nlogn

    • 如果它单独出现,是 log⁡n\log nlogn。
    • 如果它作为外层循环,且内层循环是 j < i(累加型),答案通常是 O(n)O(n)O(n)。
    • 如果它作为外层循环,且内层循环是 j < n(固定型),答案是 O(nlog⁡n)O(n \log n)O(nlogn)。
  2. 对数级的本质

    只有当问题规模每次缩减一半 (如二分查找)或者循环变量每次乘以2独立执行 时,才会出现 log⁡n\log nlogn。

  3. 常数项忽略

    如果是 i *= 3 或者 i += 2,分析方法一样。

    • i *= 3 依然是等比数列,O(n)O(n)O(n)。
    • i += 2 依然是等差数列,仅系数变化,O(n2)O(n^2)O(n2)。

五、 应该掌握的数学公式

复习时,把这三个公式背下来,考试就能横着走:

  1. 等差数列求和
    1+2+⋯+n=n(n+1)2⇒O(n2)1 + 2 + \dots + n = \frac{n(n+1)}{2} \Rightarrow O(n^2)1+2+⋯+n=2n(n+1)⇒O(n2)
  2. 等比数列求和 (q>1q > 1q>1)
    1+2+4+⋯+2k=2k+1−1⇒O(2k)=O(n)1 + 2 + 4 + \dots + 2^k = 2^{k+1} - 1 \Rightarrow O(2^k) = O(n)1+2+4+⋯+2k=2k+1−1⇒O(2k)=O(n)
  3. 调和级数求和 (较难题目会考):
    1+12+13+⋯+1n≈ln⁡n⇒O(log⁡n)1 + \frac{1}{2} + \frac{1}{3} + \dots + \frac{1}{n} \approx \ln n \Rightarrow O(\log n)1+21+31+⋯+n1≈lnn⇒O(logn)
    (考点:比如 for(i=1;i<n;i++) 里面套一个 for(j=1; j<n; j+=i))

复习建议

把你做过的所有时间复杂度题目拿出来,按上面的三大模型进行分类。你会发现90%的题目都逃不出这个圈子。这样复习完,你心里就非常有数了。

相关推荐
业精于勤的牙5 小时前
浅谈:算法中的斐波那契数(六)
人工智能·算法
小孟的CDN5 小时前
使用pytorch进行batch_size分批训练,并使用adam+lbfgs算法——波士顿房价预测
pytorch·算法·batch·代码·adam+lbfgs
仰泳的熊猫6 小时前
1037 Magic Coupon
数据结构·c++·算法·pat考试
AI科技星6 小时前
质量定义方程的物理数学融合与求导验证
数据结构·人工智能·算法·机器学习·重构
小羊学伽瓦6 小时前
ThreadLocal
java·jvm·算法
程芯带你刷C语言简单算法题6 小时前
Day30~实现strcmp、strncmp、strchr、strpbrk
c语言·学习·算法·c
桓峰基因6 小时前
SCS 60.单细胞空间转录组空间聚类(SPATA2)
人工智能·算法·机器学习·数据挖掘·聚类
天赐学c语言6 小时前
12.17 - 合并两个有序数组 && include<> 和 include““ 的区别
c++·算法·leecode
摇摆的含羞草6 小时前
Java加解密相关的各种名词的含义,各种分类的算法及特点
java·开发语言·算法