一.算法复杂性的概念
算法的复杂性是指运行算法所需要的计算机资源的量。需要的时间资源的量称为时间复杂性,需要的空间资源的量称为空间复杂性。
这个量应该集中反映算法的效率,而从运行该算法的实际计算机中抽象出来。换句话说,这个量应该是只依赖与算法要解的问题的规模和算法的输入的函数。
这样算法复杂性可以表示为C(n,I),其中n表示算法要解问题的规模和算法的输入,用C表示复杂性。同理时间复杂度可以表示为T=T(n,I),空间复杂度可以表示为S=S(n,I)。
一般考虑复杂度的时候,我们会考虑最坏,最好,平均三种情况下的复杂度。
二.算法复杂性的渐进性态【对算法复杂性表达式的两次化简,以便分析】
【1】我们可以用T(n)的渐进表达式替代T(n)来进行复杂度分析的简化,直观上,这个渐进表达式就是T(n)中略去低阶项所留下的主项(其实就是最高项),所以它比T(n)更简单。比如:=>
【2】当两个算法的阶不相同时候,渐近复杂性分析只要关心T(n)的渐进表达式的阶就够了,不必关心包含在该渐进表达式中的常数因子。因此又可对该渐进表达式的分析进一步简化,即假设算法中用到的所有不同的元运算各执行一次所需要的时间都是一个单位时间。比如:
=>
总而言之我们分析的时候,只需要考察当问题的规模充分大时,算法的复杂性在渐进意义下的阶。为此引入渐近意义下的记号O,Ω,和o.
O(n)的定义,例子与运算规则:
(1) 根据符号O的定义,得到的只是当规模充分大时的上界。【就像上面的可以等于O(),也可以等于O()等等】这个上界的阶越低,评估就越精确。
(2)除了O外,还有,得到的只是该复杂性的下界。这个下界的阶月高,评估就越精确。具体定义这里懒得写了。
(3)还有符号。定义f(n)=(g(n))当且仅当f(n)=O(g(n))且f(n)=(g(n)),这时认为f(n)与g(n)同阶。