1.4算法复杂性分析
算法渐进分析:大O表示法
定义算法的复杂性为f,定义一个函数g,当算法问题规模n大于等于n0之后,存在一个正数c使得f(n)<=cg(n)
称f(n)在集合O(g(n))中,简称f(n)=O(g(n))
大O表示法:表达函数增长率上界(算法再复杂,也不会超过g(n)的量级)
- 一个函数增长率的上限可能不止一个,一般期望找到最小上界
算法渐进分析:大Ω表示法
定义算法的复杂性为f,定义一个函数g,当算法问题规模n大于等于n0之后,存在一个正数c使得f(n)>=cg(n)
称f(n)在集合Ω(g(n))中,简称f(n)=Ω(g(n))
大Ω表示法:表达函数增长率下界
- 一个函数增长率的下限可能不止一个,一般期望找到最大下界
注意:上下界情况的讨论是在n足够大时,可以忽略n较小时的特例,且不关心系数c的具体取值
算法度量中,关心f(n)里的最高阶项,低阶多项式可以忽略
算法渐进分析:大θ表示法
若上限和下限相等,则可用θ表示法
定义:
如果一个函数既在集合O(g(n))中又在集合Ω(g(n))中,则称其为θ(g(n))
多数情况大θ和大O的表示一样
大O表示法的单位时间:
- 简单布尔或算术运算 O(1)
简单I/O:
函数的输入输出 eg:从数组读数据等操作,参数传递
不包含键盘文件等外设I/O
函数返回
大O表示法的运算法则
加法规则:f1(n)+f2(n)=O(max(f1(n),f2(n)))
顺序结构,if结构,switch结构...
乘法规则:f1(n)f2(n)=O(f1(n)f2(n))
for,while,do-while 结构顺序找K值
最佳情况:数组中第1个元素就是K(只要检索一个元素)
复杂度O(1)
最差情况:K数组的最后元素(检索了n个元素)
等概分布时:K出现概率为1/n
平均代价:(1+2+3+…+n)/n
概率不等时:第一个元素出现概率为1/2,第二个为1/4,则第n个出现概率为(1-1/2-1/4)/(n-2)=1/4(n-2)
平均代价:1/2+2/4+(3+4+…+n)/4(n-2)=1+(n+3)/5
由上可知,概率相等于不等时,该算法平均代价为O(n)
二分检索性能分析
最佳情况:O(1)
最差情况:最大长度为log2(n+1)
检索数需下降至logn量级,平均检索代价为O(logn)
时间/空间权衡(空间复杂表示也可使用O,Ω和θ表示)
增大空间开销可能改善时间开销
可以节省空间,但往往需要增大运算时间
很多时候,数据结构的设计优先于算法,但很多问题一眼就能看出所需算法