資料結構和演算法 02時間複雜度和空間複雜度

2021-09-10 07:15:51 字數 3160 閱讀 2690

高階語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素:

1.演算法採用的策略,方案;

2.編譯產生的**質量(編譯器);

3.問題的輸入規模(輸入量的多少);

4.機器執行指令的速度。

研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增大量的乙個抽象!!

一、演算法時間複雜度概念

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式, 用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函 數。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

這種用大寫o()來體現演算法時間複雜度的激發,我們稱之為大o記法。

分析:隨著模組n的增大,演算法執行的時間的增長率和 f(n) 的增長率成正比,所以 f(n) 越小,演算法的時間複雜度越低,演算法的效率越高。

1、推導大o階方法(如果分析乙個演算法的時間複雜度)

1)用常數1取代執行時間中的所有加法常數

2)在修改後的執行次數中,只保留最高項(如:2 + 2n + n^2 + n^3,則保留n^3)

3)如果最高端項存在且不是1,則去除與這個項相乘的常數(如:3n^3,則保留n^3)

4)得到的最後結果就是大o階

1

int sum = 0, n = 100

;2 printf("

i'll move on.\n");

3 printf("

i'll move on.\n");

4 printf("

i'll move on.\n");

5 printf("

i'll move on.\n");

6 printf("

i'll move on.\n");

7 printf("

i'll move on.\n

");

上面**的大o階並不是o(8),按照概念"t(n)是關於問題規模n的函式來說"、"1)"證明,o(1)才是正確答案;

一般含有非巢狀迴圈涉及線性階,線性階就是隨著問題規模n的擴大,對應計算次數呈直線增長。

1

int i, sum = 0, n = 100;2

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

上面這段**,它的迴圈的時間複雜度為o(n),因為迴圈體中**需要執行n次。

1

int i, j, n = 100;2

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

6 }

n等於100,也就是說外層迴圈每執行一次,內層迴圈就執行100次,那總共想要從這兩個迴圈出來,需要執行100*100次,也就是n的平方。所以這段**的複雜度為 o(n^2)。

如果三個巢狀迴圈,那就是n^3。所以我們就可以得出結論:迴圈的時間複雜度等於迴圈體的複雜度乘以該迴圈執行的次數。

1

int i, j, n = 100;2

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

6 }

分析該**,最後執行的次數為:n * (n + 1) /2 = n^2/2 + n/2;

使用推導大o階的攻略,第一條忽略(沒有常數相加)。第二條只保留最高項(去掉)。第三條,去除與最高項相乘的常數,最終得o(n^2)。

1

int i = 1, n = 100;2

while (i

5 printf("

%d", i);

假設有x個2相乘後大於或等於n,則退出迴圈。

得到 2^x = n → x = log(2)n,所以這個迴圈的時間複雜度為 o(logn)。

函式呼叫的時間複雜度分析:

1)

1

//大o階為 o(1)

2void function(int

count) 56

7int main(int argc, const

char *ar**)

1415

return0;

16 }

2)

1

//大o階為 o(n)

2void function(int

count) 8}

910int main(int argc, const

char *ar**)

1718

return0;

19 }

常見的時間複雜度:

常用的時間複雜度所耗費的時間從小到大依次是:

o(1) < o(logn) < o(n) < o(nlogn) < o(n^2) < o(n^3) < o(2^n) < o(n!) < o(n^n).

最壞情況與平均情況:

平均執行時間是期望的執行時間。

最壞執行時間是一種保證。在應用中,這是一種最重要的需求,通常除非特別指定,我們提到的執行時間都是最壞情況的執行時間。

二、演算法的空間複雜度

空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s(n)=o(f(n))。比如直接插入排序的時間複雜度是o(n^2),空間複雜度是o(1) 。而一般的遞迴演算法就要有o(n)的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面衡量。

通常所說的複雜度指的是時間複雜度!

posted @

2016-03-11 13:30

kingdev 閱讀(

...)

編輯收藏

資料結構和演算法(二) 時間複雜度和空間複雜度

演算法效率的度量方法 事後統計方法 這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同酸防編制的程式執行時間進行比較,從而確定演算法效率的高低。這種方法有很大的缺陷,必須依據演算法事先編制好測試程式,通常需要花費大量時間和精力,如果完了發覺測試的是糟糕的演算法,就會功虧一簣。不同測試環...

資料結構01 時間複雜度和空間複雜度

什麼是時間複雜度?什麼是空間複雜度?遞迴斐波那契數列優化,尾遞迴優化 迴圈優化 常見時間複雜度 演算法就是計算或解決問題的步驟,用來將輸入資料轉化成輸出結果。演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演...

資料結構與演算法2 時間複雜度和空間複雜度

演算法效率的度量方法 事後統計的方法 事前分析估算方法。演算法的時間複雜度 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度記作 t n o f n 它表示隨問題規模n的增大,演算法執行時間的增長率和f n ...