时间和空间复杂度

算法复杂度

算法复杂度分为和。

  • 时间复杂度是指执行算法所需要的计算工作量。
  • 空间复杂度是指执行这个算法所需要的内存空间。

时间复杂度代表「时效(运行时间)」和空间复杂度代表「存储(占用空间)」

我们都是用“时间复杂度”来指运行时间的需求,是用“空间复杂度”指空间需求。一般说的“复杂度” ,通常指的是时间复杂度

事例场景:

  • 场景1:给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天?
    • 答案: 3 * 10 = 30天。
      如果面包的长度是 N 寸呢?
      此时吃掉整个面包,需要 3 X n = 3n 天。
      如果用一个函数来表达这个相对时间,可以记作 T(n) = 3n
  • 场景2:给小灰一条长16寸的面包,小灰每5天吃掉面包剩余长度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸......那么小灰把面包吃得只剩下1寸,需要多少天呢?
    • 答案是 5 X = 5 X 4 = 20 天。
      如果面包的长度是 N 寸呢?
      需要 5 X = 5天,记作 T(n) = 5
  • 场景3:给小灰一条长10寸的面包和一个鸡腿,小灰每2天吃掉一个鸡腿。那么小灰吃掉整个鸡腿需要多少天呢?
    • 答案是2天。因为只说是吃掉鸡腿,和10寸的面包没有关系 。
      如果面包的长度是 N 寸呢?
      无论面包有多长,吃掉鸡腿的时间仍然是2天,记作 T(n) = 2
  • 场景4:给小灰一条长10寸的面包,小灰吃掉第一个一寸需要1天时间,吃掉第二个一寸需要2天时间,吃掉第三个一寸需要3天时间.....每多吃一寸,所花的时间也多一天。那么小灰吃掉整个面包需要多少天呢?
    • 答案是从1累加到10的总和,也就是55天
      如果面包的长度是 N 寸呢?
      此时吃掉整个面包,需要 1+2+3+......+ n-1 + n = (1+n)*n/2 = 0.5n^2 + 0.5n。
      记作 T(n) = 0.5n^2 + 0.5n

总结

计算公式坐标轴.png

这四种时间复杂度究竟谁用时更长,谁节省时间呢?
根据斜率,得出结论:
O(1) < O() < O(n) < O(n^2)
常用的时间复杂度所耗费的时间从小到大依次是:�
O(1) < O() < (n) < O(n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

复杂度与效率挂钩

我们来举一个栗子:

算法A的相对时间规模是T(n) = 100n,时间复杂度是O(n)
算法B的相对时间规模是T(n) = 5n^2,时间复杂度是O(n^2)
算法A运行在小灰家里的老旧电脑上,算法B运行在某台超级计算机上,运行速度是老旧电脑的100倍。
那么,随着输入规模 n 的增长,两种算法谁运行更快?

运算次数.png

推导时间复杂度

如何推导出时间复杂度呢?有如下几个原则:

  • 如果运行时间是常数量级,用常数1表示;
  • 只保留时间函数中的最高阶项;
  • 如果最高阶项存在,则省去最高阶项前面的系数。

Ο()、Ο(n)、 Ο(n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2^n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者(即指数时间复杂度的算法)称为NP(Non-Deterministic Polynomial, 非确定多项式)问题。

你可能感兴趣的:(时间和空间复杂度)