一.引入时间复杂度
通俗易懂的来说,时间复杂度是这样的
时间复杂度 = 基本运算步骤数量 × 每步运行所需要的时间
那么,基本运算步骤数量是什么呢??本噹来举一个简单的例子哈:
1 for i in range(n): 2 print(n)
上述代码我们得循环n遍,此处的n指的就是基本运算步骤的数量;
其次,每步运行所需要的时间又是什么??
这个我们依据物理机的不同,参考度不同,一般情况下通常会忽略每步所需运行的时间。
经过上述分析,此时的时间复杂度长这样:
时间复杂度 = 基本运算步骤数量
时间复杂度可以分为:最优时间复杂度,最坏时间复杂度,平均时间复杂度。
二.时间复杂度O(n)的概念
相信大家都接触过高阶无穷小的概念,在这简单说一下哈
定义:当x->x0时,f(x) = 0,g(x)=0,如果当x->0时,f(x)/g(x)=0,那么称f(x)是g(x)的高阶无穷小,表示为O(g(x))
O(n)这个大O表示的是最坏情况下的时间复杂度(最坏时间复杂度)
举个例子:一共n^3次乘法和n^3次加法,那么加起来就是2×n^3。如果有一个表达式f(n),使得n趋于无穷大的时候,
lim(2×n^3)/f(n) = 常数c
那么就可以用O(f(n))表示。此处的f(n) 可以是n^3,即O(n^3)
三.时间复杂度的基本规则
1.基本操作:即只有常数项,认为其时间复杂度为O(1)
2.顺序结构:时间复杂度依加法原则进行计算(1+1+1)
1 print(a) 2 print(b) 3 print(c)
3.循环结构:时间复杂度依乘法原则进行计算(O(n*m))
1 for i in range(n): 2 for j in range(m): 3 print(100)
4.分支结构:时间复杂度取最大值(O(max(n,m))
1 if i > 0: 2 for j in range(n): 3 print(j) 4 else: 5 for z in range(m): 6 print(m)
5.判断一个算法的效率时,往往只需关注操作数量的最高次项,其它次要项和常数项均可忽略
执行次数函数举例 | 阶 | 非正式术语 |
12 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n2+2n+1 |
O(n2) | 平方阶 |
6log2n+23 | O(logn) | 对数阶 |
4n+3nlog2n+13 | O(nlogn) | nlogn阶 |
6n3+2n2+3n+1 | O(n3) | 立方阶 |
2n |
O(2n) | 指数阶 |
6.常见时间复杂度之间的关系
所消耗的时间从小到大:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)