算法效率的度量
一:事后统计法
a.比较不同算法对同一组输入数据的运行处理时间。
缺陷:
a.为了获得不同算法的运行时间必须编写相应程序。
b.运行时间严重依赖硬件以及运行时的环境因素。
c.算法的测试数据的选取相当困难。
总结:事后统计法虽然直观,但是实施困难且缺陷多,一般不予考虑。
二:事前分析估算
a.依据统计的方法对算法效率进行估算。
影响算法效率的主要因素:
a.算法采用的策略和方法。
b.问题的输入规模。
c.编译器所产生的代码。
d.计算机执行速度。
function fn_sun(array,len){
var i =0; 1
var j=0; 1
var s=0; 1
for(i=0;i<len;i++){
for(j=0;j<len;j++){
s+=i*j; n*n(关键部分)
}
}
return s; 1
}
t = (n*n+4)*T;
T:js程序执行代码时间
启示:
a.随着问题规模n的增大,它们操作数量的差异会越来越大,因此实际算法在时间效率上的差异性会变得非常明显!
b.判断一个算法的效率时,往往只需要关注操作数量的“最高次项”,其他次要项和常数项可以忽略。
大O表示法
a.算法效率严重“依赖”于“操作(Operation)数量”。
b.在判断时首先关注操作数量的“最高次项”。
c.操作数量的估算可以作为时间复杂度的估算。
O(5) = O(1)
O(2n+1) = O(2n) =O(n)
O(n*n+n+1) = O(n*n)
O(3*n*n*n+1) =O(3*n*n*n)= O(n*n*n+1)
常见的时间复杂度类型:
执行函数 阶 非正式术语
12 O(1) 常数阶
2n+3 O(n) 线性阶
3n*n+2*n_1 O(n*n) 平方价
5log2n+20 O(logn) 对数阶
2n+3nlog2n+19 O(nlogn) nlogn阶
6n*n*n+2n*n+3n+4 O(n*n*n) 立方阶
2的n次方 O(2的n次方) 指数阶
关系:
O(1)<O(logn)<O(n)<O(nlogn)<O(n*n)<O(n*n*n)<O(2的n次方)<
O(n!)<O{n的n次方}
最坏与最好
function search(array,len,n){
var ret =-1;
var i=0;
for(i=0;i<len;i++){
if(array[i]==n){
ret = i;
break;
}
}
return ret;
}
var array = [1,2,3,4,5];
console.log(search(array,5,1)); 最好的情况,复杂度O(1)
console.log(search(array,5,5)); 最坏的情况, 复杂度O(n)
意义:
当算法在最坏情况下仍然能满足需求时,可以推断,算法的最好情况和平均情况都满足需求。
空间与时间的策略
a.多数情况下,算法执行时“所用的时间”更令人关注。
b.如果有必要,可以通过增加空间复杂度来降低时间复杂度。
c.同理,也可以通过增加时间复杂度来降低空间复杂度。
注意:
在实现算法时,需要分析具体问题对执行时间和空间的要求。