18

时间复杂度

场景一:一根长10寸的面包,每3天吃掉一寸,那么吃完整个面包需要几天?
答案自然是:3×10=30天
可以记作:T(n) = 3n

场景二:一根16寸的面包,每5天吃掉剩余的一半,吃的只剩下1寸,需要多少天?
答案:以2为底,16的对数,简写成log16,所以为 5×log16 = 20天
可以记作: T(n) = 5logn

场景三:每2天吃掉一个鸡腿,那么吃掉整个鸡腿需要多少天?
答案:2天
可以记作:T(n) = 2

场景四:一根长10寸的面包,吃掉第一个一寸需要1天,吃掉第二个1寸需要2天,吃完整个面包需要多少天?
答案:从1累加到10,共55天
可以记作:T(n) = 0.5n^2+0.5n

这四个场景分别是:线性式、对数式、常量式、多项式

渐进时间复杂度:

比如算法A的相对时间是 T(n)=100n,算法B的相对时间是T(n)=5n^2,到底哪个运行时间长呢?这要看n的取值

官方定义:

若存在函数 f(n),使得当 n 趋近于无穷大时,T(n)/f(n) 的极限值为不等于零的常数,则称 f(n) 是 T(n) 的同数量级函数
记作 T(n)=O(f(n)) 称为O(f(n))为算法的渐进时间复杂度,简称时间复杂度,渐进时间复杂度用大写 O 表示,所以也被称为大O表示法

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

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

回头看上面四个场景

T(n) = 3n -> T(n) = O(n)
T(n) = 5logn -> T(n) = O(logn)
T(n) = 2 -> T(n) = O(1)
T(n) = 0.5n^2+0.5n -> T(n) = O(n^2)

文章:什么是时间复杂度?


uccs
756 声望88 粉丝

3年 gis 开发,wx:ttxbg210604