高效算法之时间复杂度介绍
上一篇博客已经给大家介绍了一些算法题,明天刚好是中秋了,这里祝大家中秋快乐。刚好赶上数学建模了,今天就先介绍与衡量算法水平的重要指标时间复杂度吧。在时间充裕情况下会更新5+2。之后还会介绍空间复杂度以及python内置函数的时间复杂度。
1.简介
先看一下什么是时间复杂度:
衡量代码的好坏,包括两个非常重要的指标:
运行时间和占用空间。
代码的绝对执行时间是无法估计的,但可以预估代码的基本执行次数。
2.程序中最常见的四种执行方式有
(1)T(n) = kn,执行次数是线性的。
可以理解为有一个任务,完成全部要达到n,每k个时间完成任务的1/n,则完成全部任务所需要的时间为kn个时间。
(2)T(n) = klog(a)(N),执行次数是对数的。
可以理解为有一个任务,完成全部要达到n,每k个时间完成任务的1/a,然后下一个时间完成剩下任务的1/a,依次循环,则完成全部任务所需要的时间为kloa(a)N个时间。
(3)T(n) = k,执行次数是常量的。
可以理解为有一个任务,完成全部要达到n,则k个时间完成任务的n,也就是需要k个时间完成所有任务,这个是可以得到代码的绝对执行时间的,则完成全部任务所需要的时间为k个时间。
(4)T(n) = 0.5n^2 + 0.5n,执行次数是一个多项式。
可以理解为有一个任务,完成全部要达到n,完成第一个1要1个时间,完成第二个1要2个时间,就是不断相加,这里简化了,则完成全部任务所需要的时间为0.5n^2 + 0.5n个时间。
(5)时间复杂度
但是上面的不同情况的由于算法不同无法比较,而且有时候根据n的取值比较结果也不同。这时候就有了渐进时间复杂度的概念:
若存在函数 f(n),使得当n趋近于无穷大时,T(n)/ f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。
记作 T(n)= O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度,也被称为大O表示法。
(6)时间复杂度的规则
如果运行时间是常数量级,用常数1表示;
只保留时间函数中的最高阶项;
如果最高阶项存在,则省去最高阶项前面的系数。
就是当运行时间不是常数时,省去前面的k系数。
一般常见的时间复杂度的比较为:O(1)< O(logn)< O(n)< O(n^2)