时间复杂度

这种题目是数据结构与算法考研(如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%的题目都逃不出这个圈子。这样复习完,你心里就非常有数了。

相关推荐
2301_764441333 小时前
LISA时空跃迁分析,地理时空分析
数据结构·python·算法
东北洗浴王子讲AI3 小时前
GPT-5.4辅助算法设计与优化:从理论到实践的系统方法
人工智能·gpt·算法·chatgpt
Billlly4 小时前
ABC 453 个人题解
算法·题解·atcoder
玉树临风ives4 小时前
atcoder ABC 452 题解
数据结构·算法
feifeigo1234 小时前
基于马尔可夫随机场模型的SAR图像变化检测源码实现
算法
fengfuyao9855 小时前
基于STM32的4轴步进电机加减速控制工程源码(梯形加减速算法)
网络·stm32·算法
551只玄猫6 小时前
【数学建模 matlab 实验报告13】主成分分析
开发语言·数学建模·matlab·课程设计·主成分分析
无敌昊哥战神6 小时前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法
小白菜又菜6 小时前
Leetcode 2075. Decode the Slanted Ciphertext
算法·leetcode·职场和发展
Proxy_ZZ06 小时前
用Matlab绘制BER曲线对比SPA与Min-Sum性能
人工智能·算法·机器学习