浅析算法及空间复杂度的理解

一、算法

  算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?

  主要还是从算法所占用的「时间」和「空间」两个维度去考量。

1、时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。

2、空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。

  因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是「鱼和熊掌」,不可兼得的,那么我们就需要从中去取一个平衡点。

二、空间复杂度

1、介绍:

  算法的存储量包括:(1)程序本身所占空间(2)输入数据所占空间(3)辅助变量所占空间。输入数据所占空间只取决于问题本身,和算法无关,则只需分析除输入和程序之外得辅助变量所占额外空间。

  空间复杂度是对一个算法在运行过程中临时占用得存储空间大小的量度,一般也作为问题规模n的函数,以数量级形式给出,记作:S(n) = O(g(n)),g(n)的计算规则和时间复杂度一致

2、代码分析

  既然时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际占用的空间的。

  空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。

  空间复杂度比较常用的有:O(1)、O(n)、O(n²),我们下面来看看:

(1)分析1:如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)

int fun(int n){
    int i,j,k,s;
        s=0;
        for (i=0;i<=n;i++)
               for (j=0;j<=i;j++)
                       for (k=0;k<=j;k++)
                          s++;
        return(s);
}

  由于算法中临时变量得个数与问题规模n无关,所以空间复杂度均为 S(n) = O(1)

(2)分析2:S(n) = O(g(1*n)) 即 O(n)

int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

  这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

(3)空间复杂度:O(n²)

  空间复杂度主要是观察这个程序在运行的时候到底用到了多少空间。

  程序和变量都会占据一定的空间,当涉及循环递归的时候,一般都是O(n)起步。

  设计递归的时候,如果是产生变大小数组,一般是O(n方)的复杂度。

posted @ 2017-10-10 15:12  古兰精  阅读(1630)  评论(0编辑  收藏  举报