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

2022-08-10 07:21:10 字數 2873 閱讀 7854

演算法採用的策略,方案

編譯產生的**質量

問題的輸入規模

機器執行指令的速度

由此可見,拋開這些與計算機硬體、軟體有關的因素,乙個程式的執行時間依賴於演算法的好壞和問題的輸入規模 

我們研究演算法的複雜度,側重的是研究演算法隨著輸入規模擴大增長量的乙個抽象,而不是精確的定位需要執行多少次

我們不關心語言、環境等,只關心它所實現的演算法。

我們在分析乙個演算法的執行時間時,重要的是把基本操作的數量和輸入模式關聯起來

當n=1是,a演算法不如b演算法,隨著n的增長,a演算法反超b演算法,總體來說a比b演算法更優秀

函式的漸近增長:給定兩個函式f(n)和g(n),如果存在乙個整數n,使得對於所有的n>n,f(n)總是比g(n)大,那麼我們說f(n)的增長漸近快於g(n)

定義:在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法時間度量,記作t(n) = o(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的漸近時間複雜度,簡稱時間複雜度,其中f(n)是問題規模n的某個函式。(關鍵點:執行次數==時間)

如何分析乙個演算法的時間複雜度

常數階:

int sum=0,n=100

;printf(

"hello world!");

printf(

"hello world!");

printf(

"hello world!");

printf(

"hello world!");

printf(

"hello world!");

printf(

"hello world!");

printf(

"hello world!");

printf(

"hello world!");

sum = (1+n)*n/2;

時間複雜度不是o(8),而是o(1)

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

int i,sum=0,n=100

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

時間複雜度為o(n)

平方階:n次巢狀迴圈

int i,j,n=100

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

}

時間複雜度為o(nn)

對數階:

int i=1,n=100

;while(i

每次i*2就距離n更近一步,所以由2

x = n得到x = log2n,所以這個迴圈的時間複雜度為o(logn)

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

1int

i,j;

2for(i=0;i)// function函式的時間複雜度是o(1),所以整體的時間複雜度就是迴圈的次數o(n)

1int

i,j;

2for(i=0;i)

11 }//function內部的迴圈次數隨著count的增加(接近n)而減少,所以根據遊戲攻略演算法的時間複雜度為o(n2)

思考:

n++;//                 1

function(n);//           n2

for(i=0;i)//         n2

for(i=0;i)//         n2

}

答案:上述**的時間複雜度為o(n^2)

常見的時間複雜度

耗費的時間從小到大:

o(1) < o(logn) < o(n) < o(nlogn) < o(n2) < o(n3) < o(2n) < o(n!) < o(nn)

最壞情況和平均情況

首先我們要明白,我們在寫**時,完全可以用空間來換取時間。

舉個例子:判斷某一年是否為閏年

我們可以實現要給演算法,每給乙個年份,都會通過演算法計算得到是否是閏年的結果。

另一種演算法就是,建立乙個陣列,將所有年份按下標的數字對應,如果是閏年,則此陣列元素對應的值為1,否則為0.

解析:對比兩個演算法,第一種演算法很明顯節約空間,但是每一次查詢都需要進行運算,而第二種演算法,雖然在記憶體中存了幾千個陣列,但是每次查詢只需要一次索引即可。

這就是典型的空間換時間

演算法的空間複雜度通過計算演算法所需的儲存空間實現,演算法的空間複雜度的計算公式為:s(n)=o(f(n)),其中,n為問題的規模,f(n)為語句關於n所儲存空間的函式。

通常,我們都是用「時間複雜度」來指執行時間的需求,是用「空間複雜度」指空間需求

當直接要求我們求「複雜度」時,通常是指時間複雜度

顯然,對時間複雜度的追求更屬於演算法的潮流qaq

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

演算法採用的策略 方案 編譯產生的 質量 問題的輸入規模 機器執行指令的速度 由此可見,拋開計算機硬體,乙個程式的執行時間依賴於演算法的好壞和輸入規模。int i,sum 0,n 100 for i 1 i n i printf d sum int i,sum 0,n 100 sum i n n 2...

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

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

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

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