单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的!
程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢?
时间复杂度与“大O记法”
一句话:就是完成基本运算的时间总和(描述算法运行时间的快慢)
对于算法进行特别具体的细致分析虽然很好,但在实践中的实际价值有限。对于算法的时间性质和空间性质,最重要的是其数量级和趋势,这些是分析算法效率的主要部分。而计量算法基本操作数量的规模函数中那些常量因子可以忽略不计。例如,可以认为3n2和100n2属于同一个量级,如果两个算法处理同样规模实例的代价分别为这两个函数,就认为它们的效率“差不多”,都为n2级。
最坏时间复杂度
分析算法时,存在几种可能的考虑:
算法完成工作最少需要多少基本操作,即最优时间复杂度
算法完成工作最多需要多少基本操作,即最坏时间复杂度
算法完成工作平均需要多少基本操作,即平均时间复杂度
时间复杂度的几条基本计算规则
- 基本操作,即只有常数项,认为其时间复杂度为O(1)
- 顺序结构,时间复杂度按加法进行计算
- 循环结构,时间复杂度按乘法进行计算
- 分支结构,时间复杂度取最大值
- 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
- 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
注意:
- 时间复杂度只考虑最高项:
O(2^n + n^2) = O(2^n)
O(n^3 + 1000n^2) = O(n^3)
因为系数只改变了函数的陡峭程度,而不改变函数的总趋势。比如n^2 和n^ 3是有区别的。但10n^2 和 n^2是一样的。 - 时间复杂度是通过运算的步骤n来进行衡量的。
- n表示和问题相关的规模问题。
常见时间复杂度
List和Dictionary已经不是计算机的基础结构了,是python内置的数据结构。下面这个时间复杂度要掌握清楚,因为在后面更复杂的问题中,我们将考虑什么时候应用List,什么时候选择Dictionary。