269.算法的存儲空間需求

node

 

算法

數組

 

  例如,有如下算法,其中臨時空間爲變量i、maxi佔用的空間。函數

因此,空間複雜度是對一個算法在運行過程當中臨時佔用的存儲空間大小的量度,通常也做爲問題規模n的函數,以數量級形式給出,記做:
S(n)=O(g(n))、Ω(g(n))或Θ(g(n))
其中漸進符號的含義與時間複雜度中的含義相同。post

int max(int a[],int n)
{   int i,maxi=0;
    for (i=1;i<=n;i++)
    if (a[i]>a[maxi])
         maxi=i;
    return a[maxi];
}
函數體內分配的變量空間爲臨時空間,不計形參佔用的空間,
這裏的僅計i、maxi變量的空間,其空間複雜度爲O(1)。

 

spa

 

  • 算法的存儲量包括:
    • 1.輸入數據所佔空間
    • 2.程序自己所佔空間
    • 3.輔助變量所佔空間

 

【例1.9】分析例1.6算法的空間複雜度。  
void func(int n)
{   int i=1,k=100;
    while (i<=n)
    {      k++;
      i+=2;
    }
}
  解:該算法是一個非遞歸算法,其中只臨時分配了i、k兩個變量的空間,它與問題規模n無關,因此其空間複雜度均爲O(1),即該算法爲原時工做算法。

 

【例1.10】有以下遞歸算法,分析調用
    maxelem(a,0,n-1)
    的空間複雜度。
int maxelem(int a[],int i,int j)
{   int mid=(i+j)/2,max1,max2;
    if (i<j)
    {    max1=maxelem(a,i,mid);
       max2=maxelem(a,mid+1,j);
    return (max1>max2)?max1:max2;
    }
    else return a[i];
}
   解:執行該遞歸算法須要屢次調用自身,每次調用只臨時分配3個整型變量的空間(O(1))。
   設調用maxelem(a,0,n-1)的空間爲S(n),有: S(n)=O(1) 當n=1 S(n)=2S(n/2)+O(1) 當n>1 o(1)是int mid=(i+j)/2,max1,max2;常量空間 則: S(n) = 2S(n/2)+1=2[2S(n/22)+1]+1=22S(n/22)+1+21 = 23S(n/23)+1+21+22 = … = 2kS(n/2k)+1+21+22+…+2k-1(設n=2k,即k=log2n) = n*1+2k-1 = 2n-1 = O(n)

 

1.3注意

  爲何算法佔用的空間只考慮臨時空間,而沒必要考慮形參的空間呢?這是由於形參的空間會在調用該算法的算法中考慮,例如,如下maxfun算法調用max算法:3d

void maxfun()
{   int b[]={1,2,3,4,5},n=5;
  printf("Max=%d\n",max(b,n));
}
int max(int a[],int n)
{   int i,maxi=0;
    for (i=1;i<=n;i++)
    if (a[i]>a[maxi])
         maxi=i;
    return a[maxi];
}

maxfun算法中爲b數組分配了相應的內存空間,其空間複雜度爲O(n),若是在max算法中再考慮形參a的空間,這樣重複計算了佔用的空間。code

 

 

 

相關文章
相關標籤/搜索