一、算法效率的度量有两种方法
-
事后统计法
(1) 描述
比较不同算法对同一组输入数据的运行处理时间
(2) 缺陷
a. 为了获得不同算法的运行时间必须编写相应程序
b. 运行时间严重依赖硬件以及运行时的环境因素
c. 算法的测试数据的选取相当困难 - 事前统计法
(1) 描述
依据统计的方法对算法效率进行估算
(2) 影响算法效率的主要因素
a. 算法采用的策略和方法
b. 问题的输入规模
c. 编译器所产生的代码
d. 计算机执行速度 - 总结
事后统计法虽然直观,但是实施困难且缺陷多,一般不予考虑
二、大O表示法
- 描述
a. 算法效率严重依赖于操作( Operation)数量
b. 在判断时首先关注操作数量的最高次项
c. 操作数量的估算可以作为时间复杂度的估算 - 举例说明
O(5)=O(1)
O(2n+1)=0(2n)=O(n)
O(n2+n+1)=O(n2)
O(3n3+1)=O(3n3)=O(n3)
-
直观数据比较
-
关系
三、时间复杂度与空间复杂度
☆算法:计算1+2+3+...+n
- 方式一
long sum1(int n) { long ret = 0; //4 byte int* array = (int*)malloc(n * sizeof(int)); //4 + 4 * n byte int i = 0; //4 byte //总共占用了12 + 4 * n byte for(i=0; i<n; i++) { array[i] = i + 1; } for(i=0; i<n; i++) { ret += array[i]; } free(array); return ret; }
时间复杂度:O(2n + 5) = O(n)
空间复杂度:O(4n + 12) = O(n) - 方式二
long sum2(int n) { long ret = 0; //4 byte int i = 0; //4 byte //总共占用了8 byte for(i=1; i<=n; i++) { ret += i; } return ret; }
时间复杂度:O(n + 3) = O(n)
空间复杂度:O(8) = O(1) - 方式三
long sum3(int n) { long ret = 0;//4 byte //总共占用了4 byte if( n > 0 ) { ret = (1 + n) * n / 2; } return ret; }
时间复杂度:O(3) = O(1)
空间复杂度:O(4) = O(1)
四、分析
高性价比的程序应遵循两点:一是用尽量少的内存空间解决问题;二是用尽量少的步骤解决问题。方式一的做法比较直观,但先申请数组空间,初始化数组再遍历数组求和的方法,再对相对于方式二显得复杂臃肿;方式二没有使用堆空间,所以比方式一好;方式三相对于方式二更好,因为一步到位,没有遍历循环操作。其中方式一与方式二的执行效率会受n的规模影响,而方式三的执行效率无论n规模多大都是固定的。