时间复杂度
场景一:一根长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 表示
- 只保留时间函数中的最高阶项
- 如果最高阶项存在,则省去最高阶项前面的系数
回头看上面四个场景
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) |
文章:什么是时间复杂度?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。