简单介绍------空间复杂度

  1. 是什么?
    指执行某个算法所需要的内存空间

  2. 空间复杂度的介绍(来自百度
    空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

  3. 由于现在科技的发展我们完全可以用空间去换取时间
    例:要判断某年是不是闰年?

    1. 花点心思来写一个算法,每给一个年份,就可以通过这个算法计算得到是否是闰年的结果。

    2. 事先建立一个有2050个元素的数组,然后把所有的年份按下表的数字对应,如果是闰年,则此数组元素的值是1,如果不是元素的值则为0。这样,所谓的判断某一年是否为闰年就变成了查找这个数组某一个元素的值的问题。

      注:第一种方法相比起第二种来说很明显非常节省空间,但每一次查询都需要经过一系列的计算才能知道是否为闰年。第二种方法虽然需要在内存里存储2050个元素的数组,但是每次查询只需要一次索引判断即可

  4. 通常,我们都是用“时间复杂度”来指运行时间的需求,是用“空间复杂度”指空间需求。当直接要让我们求“复杂度”时,通常指的是时间复杂度。显然对时间复杂度的追求更是属于算法的潮流!

  5. 如何计算空间复杂度

    1. 一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分

    2. 若一个算法为递归算法,其空间复杂度为递归所使用的堆栈空间的大小,它等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加1,这个1表示开始进行的一次非递归调用)。

    3. 算法的空间复杂度一般也以数量级的形式给出。如当一个算法的空间复杂度

      1. 一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)

      2. 当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为O(log2n)

      3. 当一个算法的空间复杂度与n成线性比例关系时,可表示为O(n)

    4. 若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间

    5. 若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量

举个例子1:

空间复杂度分析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:

void fun(int a[],int n,int k){//数组a共有n个元素
       int i;
       if (k==n-1){
             for (i=0;i<n;i++)  
                 printf("%d\n",a[i]);  //执行n次
        }else{  
            for (i=k;i<n;i++)
               a[i]=a[i]+i*i;          //执行n-k次
            fun(a,n,k+1);
       }
}

每次调用本身都要分配空间,fun(a,n,0)的空间复杂度为O(n)。

版权声明:本博客为记录本人自学感悟,内容大多从网上学习与整理所得,若侵权请告知!

https://me.csdn.net/qq_39657909

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页