乙個演算法語句總的執行次數是關於問題規模n的某個函式,記為f(n),n稱為問題的規模。語句總的執行次數記為t(n),當n不斷變化時,t(n)也在變化,演算法執行次數的增長速率和f(n)的增長速率相同。
1、常數階o(1),不存在迴圈結構,如以下**段
int sum = 0, n = 100;
printf(「i love you.com\n」);
printf(「i love you.com\n」);
printf(「i love you.com\n」);
printf(「i love you.com\n」);
printf(「i love you.com\n」);
printf(「i love you.com\n」);
sum = (1+n)*n/2;
2、線性階o(n),一般含有非巢狀迴圈涉及線性階,線性階就是隨著問題規模n的擴大,對應計算次數呈直線增長。
int i , n = 100, sum = 0;
for( i=0; i < n; i++ )
上面這段**,它的迴圈的時間複雜度為o(n),因為迴圈體中的**需要執行n次。
3、平方階
int i, j, n = 100;
for( i=0; i < n; i++ )
}
n等於100,也就是說外層迴圈每執行一次,內層迴圈就執行100次,那總共程式想要從這兩個迴圈出來,需要執行100*100次,也就是n的平方。所以這段**的時間複雜度為o(n^2)。
總結:如果有三個這樣的巢狀迴圈就是n^3。所以總結得出,迴圈的時間複雜度等於迴圈體的複雜度乘以該迴圈執行的次數。
int i, j, n = 100;
for( i=0; i < n; i++ )
}
乙個程式的空間複雜度是指執行完乙個程式所需記憶體的大小,利用程式的空間複雜度,可以對程式的執行所需要的記憶體多少有個預先估計。乙個程式執行時除了需要儲存空間和儲存本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些為現實計算所需資訊的輔助空間。程式執行時所需儲存空間包括以下兩部分。
(1)固定部分:這部分空間的大小與輸入/輸出的資料的個數多少、數值無關,主要包括指令空間(即**空間)、資料空間(常量、簡單變數)等所佔的空間,這部分屬於靜態空間。
(2)可變空間:這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等,這部分的空間大小與演算法有關。乙個演算法所需的儲存空間用f(n)表示。s(n)=o(f(n)),其中n為問題的規模,s(n)表示空間複雜度。
1、空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。
2、乙個演算法在計算機上占用的記憶體包括:程式**所占用的空間、輸入輸出資料所占用的空間、輔助變數所占用的空間這三個方面。程式**所占用的空間取決於演算法本身的長短,輸入輸出資料所占用的空間取決於要解決的問題,是通過參數列呼叫函式傳遞而來,只有輔助變數是演算法執行過程中臨時占用的儲存空間,與空間複雜度相關。
3、通常來說,只要演算法不涉及到動態分配的空間以及遞迴、棧所需的空間,空間複雜度通常為o(1)。
4、演算法的空間複雜度並不是計算實際占用的空間,而是計算整個演算法的輔助空間單元的個數,與問題的規模沒有關係
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...