大O复杂度表示法

大O复杂度 #

分析如下代码的复杂度:

示例1:线性复杂度 #

int cal(int n) {
  int sum = 0;
  int i = 1;
  for (; i <= n; ++i) {
    sum = sum + i;
  }
  return sum;
}

假设每行代码执行时间为 unit_time:

  • 第2、3行:各1个unit_time
  • 第4、5行:各执行n次,共2n个unit_time
  • 总时间:T(n) = (2n+2) × unit_time

示例2:平方复杂度 #

int cal(int n) {
  int sum = 0;
  int i = 1;
  int j = 1;
  for (; i <= n; ++i) {
    j = 1;
    for (; j <= n; ++j) {
      sum = sum + i * j;
    }
  }
}
  • 第2、3、4行:各1个unit_time
  • 第5、6行:执行n次,共2n个unit_time
  • 第7、8行:执行n²次,共2n²个unit_time
  • 总时间:T(n) = (2n²+2n+3) × unit_time

大O表示法 #

代码执行时间T(n)与执行次数成正比,可以表示为:

T(n) = O(f(n))

其中:

  • T(n):代码执行时间
  • n:数据规模大小
  • f(n):代码执行次数总和
  • O:表示成正比关系

简化原则:当n很大时,低阶、常量、系数都可以忽略,只保留最大量级。

因此:

  • 示例1:T(n) = O(n)
  • 示例2:T(n) = O(n²)

大O时间复杂度表示代码执行时间随数据规模增长的变化趋势,也叫渐进时间复杂度。