复杂度分析也是一种用来评价算法的性能的方法,相比较时间的统计方法(依赖于平台)和指令计数的不切实际,复杂度分析只需要纸和笔来进行简单的代数的计算
复杂度的阶
算法的分析中,如果一个算法对于任何的问题规模,都需要相同的操作的次数,那么他就是一个常数阶的性能。例子:列表的索引就是典型的常数阶
对数阶的性能要比线性阶好一些,但是相比常数阶要差。一个对数阶的算法的工作量和问题的log2成正比,当问题的规模翻倍的时候,该算法的工作量也就是只是多一次而已。
一个多项式阶的时间算法的工作量,按照n^k的速率增加。其中k是一个大于1 的常数。
比多项式的阶更加复杂的是指数阶。指数阶的算法对于较大的问题而言是不切实际的。
大O表示法
一个算法的工作量通常是一个多项式的数项之和。当用多项式来表达工作量的时候,有一个项是主项,随着n的变大而越来越大,以至于可以忽视其他的项的工作量。
大O表示法的原理是:on the order of(在……阶),这是对算法的工作量的复杂度的一种表述,例如一个线性算法的阶是O(n)
常量比例的作用
常量比例设计在O分析中经常会被忽略的项和系数。然而当项很大时候,他们可能会影响到算法,对于较小的或者中等大小的数据的集合。更是如此。
以一下的代码为例:
work=1
for x in range(problemsize):
work+=1
work-=1
注意以上的代码除去循环自身,还有三行代码,其中每一行都是赋值的语句,这三条语句中的每一条都需要常量时间,还要假设,在每一次的迭代中,隐藏在循环开始处的管理循环的开销,也运行一条需要常量时间的指令,因此这个算法所执行的抽象的工作量为3n+1。尽管n和3n+1这两个工作量的运行时间都是按照相同的速率增加的。