空间复杂度

< 上一页 时间复杂度 单向链表 下一页 >

算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。程序在运行时候动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。而那些静态的空间,比如代码,常量以及简单的变量与空间复杂度无关。

 

比较下面的程序1和程序2

程序1

void reversestr(char *str, int len)

{

       for(int i = 0; i < len/2;i++)

       {

              char tmp;

              tmp = str[i];

              str[i] = str[len-i-1];

              str[len-i-1] = tmp;

       }

}

程序2

char * reversestr(char *str, int len)

{

       char *strnew = (char *) malloc(len+1);

       if (strnew == NULL)

       {

              return NULL;

       }

       memset(strnew, 0, len+1);

       int pos = 0;

       for(int i = len-1; i >=0; i--)

       {

              strnew[pos++]= str[i];

       }

       return strnew;

}

 

程序1和程序2实现的功能都是将一个输入的字符串进行逆置,比如”hello world”逆置为”dlrow olleh”。程序1在计算过程中,只申请了一个临时变量tmp,因此它的空间复杂度为O1);程序2则在计算过程中,动态分配了一个内存,而且该内存大小与输入字符串长度成正比,因此该算法的空间复杂度为On)。

 

再看下面这个算法:找出所有数中重复的数,这些数范围都在065536之间。

#define    MAXMUM     65536

void FindRepeated(int a[], int n)

{

       int tmp[MAXMUM];//定义一个局部数组,用来计算数组a[]中重复的数的次数

       int i;

       for (i = 0; i < MAXMUM; i++)

      {

              tmp[i] = 0;

       }

       for (i = 0; i < n; i ++)

      {

              tmp[a[i]]++;//数组a[]中的元素,在tmp[]中重复一次,加1

      }

       for (i = 0; i < MAXMUM; i++)

      {

              if (tmp[i]>1)//如果tmp[i]的值大于1,那么i就是数组a[]中重复的数

                     printf(“%d”, i);

       }

}

那么,上面的代码的空间复杂度是多少呢?答案是:O(1)。尽管在计算过程中,程序在栈上分配了tmp[MAXMUM]这么大的一个空间,但由于它的大小是常量,不会随着问题的规模扩大而变大,因此空间复杂度就是O1)。

< 上一页 时间复杂度 单向链表 下一页 >

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注