1. 程式人生 > >時間複雜度和空間複雜度

時間複雜度和空間複雜度

一個演算法的優劣主要是從演算法所需要執行的時間和所需要的空間進行衡量的
一、時間複雜度
時間複雜度並不是表示演算法執行的時間,而是執行演算法語句的次數。
當我們遇到多個演算法的時候,我們可以根據演算法的時間複雜度還衡量哪個演算法的花費時間長,哪個演算法花費的時間短。
常見的時間複雜度有:
常數階O(1),
對數階O(log2 n),
線性階O(n),
線性對數階O(n log2 n),
平方階O(n^2),
立方階O(n^3)
k次方階O(n^K),
指數階O(2^n)。
隨著n的不斷增大,時間複雜度不斷增大,演算法花費時間越多。
計算方法
①選取相對增長最高的項
②最高項係數是都化為1
③若是常數的話用O(1)表示
f(n)=2*n^3+2n+100則O(n)=n^3


通常我們計算時間複雜度都是計算最壞情況
時間複雜度的計算:
(1)如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間複雜度是O(1)。

        int x=1;
    while (x <10)
    {
        x++;
    }
    該演算法執行次數是10,是一個常數,用時間複雜度表示是O(1)。

(2)當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。

  for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            ;
        }
    }
    該演算法for迴圈,最外層迴圈每執行一次,內層迴圈都要執行n次,執行次數是根據n所決定的,時間複雜度是O(n^2)。

(3)迴圈不僅與n有關,還與執行迴圈所滿足的判斷條件有關。

int i=0;
while (i < n && arr[i]!=1)
    {
        i++;
    }
    在此迴圈,如果arr[i]不等於1的話,時間複雜度是O(n)。如果arr[i]等於1的話,則迴圈不能執行,時間複雜度是0。

空間複雜度
空間複雜度是對一個演算法在執行過程中臨時佔用儲存空間大小的量度。
計算方法:
①忽略常數,用O(1)表示
②遞迴演算法的空間複雜度=遞迴深度N*每次遞迴所要的輔助空間
③對於單執行緒來說,遞迴有執行時堆疊,求的是遞迴最深的那一次壓棧所耗費的空間的個數,因為遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。

如:

int a;
int b;
int c;
printf("%d %d %d \n",a,b,c);

它的空間複雜度O(n)=O(1);

int fun(int n,)
{
int k=10;
if(n==k)
return n;
else
return fun(++n);

遞迴實現,呼叫fun函式,每次都建立1個變數k。呼叫n次,空間複雜度O(n*1)=O(n)。