導航:首頁 > 源碼編譯 > 分析演算法需要分析其時間復雜度和空間復雜度

分析演算法需要分析其時間復雜度和空間復雜度

發布時間:2023-10-24 08:41:42

演算法復雜度:時間復雜度和空間復雜度

本文部分摘抄於此
演算法復雜度分為時間復雜度和空間復雜度。
時間復雜度是指執行演算法所需要的計算工作量;
而空間復雜度是指執行這個演算法所需要的內存空間。
(演算法的復雜性體現在運行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即寄存器)資源,因此復雜度分為時間和空間復雜度)。

一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。

在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間復雜度概念。 一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時, T(n)/f(n) 的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作 T(n)=O(f(n)), O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。

並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。

演算法中執行次數最多的那條語句就是基本語句,通常是最內層循環的循環體。

只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。

將基本語句執行次數的數量級放入大Ο記號中。

如果演算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果演算法中包含並列的循環,則將並列循環的時間復雜度相加。

第一個for循環的時間復雜度為Ο(n),第二個for循環的時間復雜度為Ο( n 2),則整個演算法的時間復雜度為Ο(n+ n 2)=Ο( n 2)。

Ο(1)表示基本語句的執行次數是一個常數,一般來說,只要演算法中不存在循環語句,其時間復雜度就是Ο(1)。其中 Ο(log2n)、Ο(n)、 Ο(nlog2n)、Ο(n2)和Ο(n3) 稱為多項式時間, 而Ο(2n)和Ο(n!)稱為指數時間 。計算機科學家普遍認為前者(即多項式時間復雜度的演算法)是有效演算法,把這類問題稱為 P(Polynomial,多項式)類問題 ,而把後者(即指數時間復雜度的演算法)稱為 NP(Non-Deterministic Polynomial, 非確定多項式)問題

(4)在計算演算法時間復雜度時有以下幾個簡單的程序分析法則:

(1).對於一些簡單的輸入輸出語句或賦值語句,近似認為需要O(1)時間

(2).對於順序結構,需要依次執行一系列語句所用的時間可採用大O下"求和法則"

求和法則:是指若演算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則 T1(n)+T2(n)=O(max(f(n), g(n)))

特別地, 若T1(m)=O(f(m)), T2(n)=O(g(n)),則 T1(m)+T2(n)=O(f(m) + g(n))

(3).對於選擇結構,如if語句,它的主要時間耗費是在執行then字句或else字句所用的時間,需注意的是檢驗條件也需要O(1)時間

(4).對於循環結構,循環語句的運行時間主要體現在多次迭代中執行循環體以及檢驗循環條件的時間耗費,一般可用大O下"乘法法則"

乘法法則 : 是指若演算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則T1 * T2=O(f(n) * g(n))

(5).對於復雜的演算法,可以將它分成幾個容易估算的部分,然後利用求和法則和乘法法則技術整個演算法的時間復雜度

另外還有以下2個運演算法則:(1) 若g(n)=O(f(n)),則O(f(n))+ O(g(n))= O(f(n));(2) O(Cf(n)) = O(f(n)),其中C是一個正常數

(5)下面分別對幾個常見的時間復雜度進行示例說明:

(1)、O(1)

​ Temp=i; i=j; j=temp;

以上三條單個語句的頻度均為1,該程序段的執行時間是一個與問題規模n無關的常數。演算法的時間復雜度為常數階,記作T(n)=O(1)。 注意:如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間復雜度是O(1)。

(2)、O(n2)

2.1. 交換i和j的內容

解: 因為Θ(2n2+n+1)=n2(Θ即:去低階項,去掉常數項,去掉高階項的常參得到),所以T(n)= =O(n2);

2.2.

解: 語句1的頻度是n-1

一般情況下,對步進循環語句只需考慮循環體中語句的執行次數,忽略該語句中步長加1、終值判別、控制轉移等成分,當有若干個循環語句時,演算法的時間復雜度是由嵌套層數最多的循環語句中最內層語句的頻度f(n)決定的。

(3)、O(n)

解:

(4)、O(log2n)

解:

(5)、O(n3)

解:

(5)常用的演算法的時間復雜度和空間復雜度

一個經驗規則: 其中c是一個常量,如果一個演算法的復雜度為c 、 log2n 、n 、 n log2n ,那麼這個演算法時間效率比較高 ,如果是 2n * , 3n ,n!,那麼稍微大一些的n就會令這個演算法不能動了,居於中間的幾個則差強人意。

​ 演算法時間復雜度分析是一個很重要的問題,任何一個程序員都應該熟練掌握其概念和基本方法,而且要善於從數學層面上探尋其本質,才能准確理解其內涵。

2、演算法的空間復雜度

​ 類似於時間復雜度的討論,一個演算法的空間復雜度(Space Complexity)S(n)定義為該演算法所耗費的存儲空間,它也是問題規模n的函數。漸近空間復雜度也常常簡稱為空間復雜度。

空間復雜度(Space Complexity)是對一個演算法在運行過程中臨時佔用存儲空間大小的量度。一個演算法在計算機存儲器上所佔用的存儲空間,包括存儲演算法本身所佔用的存儲空間,演算法的輸入輸出數據所佔用的存儲空間和演算法在運行過程中臨時佔用的存儲空間這三個方面。

演算法的輸入輸出數據所佔用的存儲空間是由要解決的問題決定的,是通過參數表由調用函數傳遞而來的,它不隨本演算法的不同而改變。存儲演算法本身所佔用的存儲空間與演算法書寫的長短成正比,要壓縮這方面的存儲空間,就必須編寫出較短的演算法。

演算法在運行過程中臨時佔用的存儲空間隨演算法的不同而異,有的演算法只需要佔用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是「就地"進行的,是節省存儲的演算法,如這一節介紹過的幾個演算法都是如此;

有的演算法需要佔用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將佔用較多的存儲單元,例如將在第九章介紹的快速排序和歸並排序演算法就屬於這種情況。

如當一個演算法的空間復雜度為一個常量,即不隨被處理數據量n的大小而改變時,可表示為O(1);當一個演算法的空間復雜度與以2為底的n的對數成正比時,可表示為O(log2n);當一個演算法的空I司復雜度與n成線性比例關系時,可表示為O(n).

【1】如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間復雜度是O(1)。

解答:
T(n)=O(1),
這個程序看起來有點嚇人,總共循環運行了1100次,但是我們看到n沒有?
沒。這段程序的運行是和n無關的,
就算它再循環一萬年,我們也不管他,只是一個常數階的函數

【2】當有若干個循環語句時,演算法的時間復雜度是由嵌套層數最多的循環語句中最內層語句的頻度f(n)決定的。

該程序段中頻度最大的語句是(5),內循環的執行次數雖然與問題規模n沒有直接關系,但是卻與外層循環的變數取值有關,而最外層循環的次數直接與n有關,因此可以從內層循環向外層分析語句(5)的執行次數:
則該程序段的時間復雜度為T(n)=O(n3/6+低次項)=O(n3)

【3】演算法的時間復雜度不僅僅依賴於問題的規模,還與輸入實例的初始狀態有關。

在數值A[0..n-1]中查找給定值K的演算法大致如下:

此演算法中的語句(3)的頻度不僅與問題規模n有關,還與輸入實例中A的各元素取值及K的取值有關:

(5)時間復雜度評價性能

有兩個演算法A1和A2求解同一問題,時間復雜度分別是T1(n)=100n2,T2(n)=5n3。
(1)當輸入量n<20時,有T1(n)>T2(n),後者花費的時間較少。
(2)隨著問題規模n的增大,兩個演算法的時間開銷之比5n3/100n2=n/20亦隨著增大。
即當問題規模較大時,演算法A1比演算法A2要有效地多。它們的漸近時間復雜度O(n2)和O(n3)從宏觀上評價了這兩個演算法在時間方面的質量。

在演算法分析時,往往對演算法的時間復雜度和漸近時間復雜度不予區分,而經常是將漸近時間復雜度T(n)=O(f(n))簡稱為時間復雜度,其中的f(n)一般是演算法中頻度最大的語句頻度。

其實生活很美好,只是你想的太多了。沒有,不會,有差距很正常,因為我不會

Ⅱ 數據結構中評價演算法的兩個重要指標是什麼

數據結構中評價演算法的兩個重要指標是時間復雜度和空間復雜度。

同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程序的效率。演算法分析的目的在於選擇合適演算法和改進演算法。一個演算法的評價主要從時間復雜度和空間復雜度來考慮。

1、時間復雜度:

演算法的時間復雜度是指執行演算法所需要的計算工作量。一般來說,計算機演算法是問題規模n 的函數f(n),演算法的時間復雜度也因此記做。

2、空間復雜度:

演算法的空間復雜度是指演算法需要消耗的內存空間。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示。同時間復雜度相比,空間復雜度的分析要簡單得多。

(2)分析演算法需要分析其時間復雜度和空間復雜度擴展閱讀:

評估演算法效率的方法:

1、事後統計方法

這種方法主要是通過設計好的測試程序和數據,利用計算機計時器對不同演算法編制的程序的運行時間進行比較,從而確定演算法效率的高低。

2、事前分析估算方法

在計算機程序編寫前,依據統計方法對演算法進行估算。經過總結,可以發現一個高級語言編寫的程序在計算機上運行時所消耗的時間取決於下列因素:演算法採用的策略、編譯產生的代碼質量、問題的輸入規模、機器執行指令的速度。

參考資料來源:網路-演算法

閱讀全文

與分析演算法需要分析其時間復雜度和空間復雜度相關的資料

熱點內容
安卓手機mp3壓縮工具 瀏覽:214
程序員和交易員 瀏覽:422
怎麼變字體樣式app 瀏覽:173
名字叫湯什麼的視頻app 瀏覽:207
金屬加密鍵盤聯系電話 瀏覽:333
自製解壓牛奶盒子教程 瀏覽:62
編譯高手的圖片 瀏覽:922
單片機數碼管顯示時分秒 瀏覽:780
手指解壓最簡單的方法 瀏覽:343
韓國郵箱伺服器地址 瀏覽:967
android版本介紹 瀏覽:410
pdf文件加密軟體 瀏覽:410
長沙住房app怎麼看備案 瀏覽:603
安裝加密軟體的電腦會被監控么 瀏覽:221
java微博源碼 瀏覽:569
堆排序簡單實現python 瀏覽:461
單片機引腳與鍵盤的關系 瀏覽:132
壓縮火柴盒製作 瀏覽:38
谷歌地圖android偏移 瀏覽:214
bitlocker硬碟加密空間 瀏覽:238