极客时间算法摘录

时间复杂度分析

1.原则

  • 只关注循环执行次数最多的一段代码
  • 加法法则:总复杂度等于量级最大的那段代码的复杂度
如果 T1(n)=O(f(n)),T2(n)=O(g(n));
那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))).
  • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 
T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)).

2.常见复杂度分析

O(1) 常量级复杂度

  • 代码的执行时间不随着n的增大而增大,这样的时间复杂度为O(1)
  • 算法中不存在循环语句,递归语句等.基本可以认为是O(1)

O(logn)、O(nlogn)

  • 一个是涉及到a个数的b次方等于n的时候,可以考虑O(logn),而对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为 O(logn)
  • O(nlogn) 可以用乘法法则解释为O(nlogn) = O(n) * O(logn),即O(logn)的场景下,执行了n次

m n 两种规模下的的加法和乘法法则 O(m+n)、O(m*n)


int cal(int m, int n) {
  int sum_1 = 0;
  int i = 1;
  for (; i < m; ++i) {
    sum_1 = sum_1 + i;
  }

  int sum_2 = 0;
  int j = 1;
  for (; j < n; ++j) {
    sum_2 = sum_2 + j;
  }

  return sum_1 + sum_2;
}
  • m 和 n 是表示两个数据规模。我们无法事先评估 m 和 n 谁的量级大,所以我们在表示复杂度的时候,就不能简单地利用加法法则,省略掉其中一个。所以,上面代码的时间复杂度就是 O(m+n)。
  • 针对这种情况,原来的加法法则就不正确了,我们需要将加法规则改为:T1(m) + T2(n) = O(f(m) + g(n))。但是乘法法则继续有效:T1(m)*T2(n) = O(f(m) * f(n))。

推荐阅读更多精彩内容