算法的时间复杂度与空间复杂度

    xiaoxiao2024-10-15  111

    一、算法效率的度量有两种方法

    事后统计法

    (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规模多大都是固定的。  

        

     

    最新回复(0)