事后统计法
(1) 描述 比较不同算法对同一组输入数据的运行处理时间 (2) 缺陷 a. 为了获得不同算法的运行时间必须编写相应程序 b. 运行时间严重依赖硬件以及运行时的环境因素 c. 算法的测试数据的选取相当困难事前统计法 (1) 描述 依据统计的方法对算法效率进行估算 (2) 影响算法效率的主要因素 a. 算法采用的策略和方法 b. 问题的输入规模 c. 编译器所产生的代码 d. 计算机执行速度总结 事后统计法虽然直观,但是实施困难且缺陷多,一般不予考虑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规模多大都是固定的。