1 3演算法時間複雜度和空間複雜度的計算

2021-09-05 11:49:32 字數 2071 閱讀 7267

演算法,即解決問題的方法。同乙個問題,使用不同的演算法,雖然得到的結果相同,但是耗費的時間和資源是不同的。

就比如要擰乙個螺母,使用扳手還是鉗子是有區別的,雖然使用鉗子也能擰螺母,但是沒有扳手好用。

「條條大路通羅馬」,解決問題的演算法有多種,這就需要判斷哪個演算法「更好」。

很多人誤以為程式就是演算法,其實不然:演算法是解決某個問題的想法、思路;而程式是在心中有演算法的前提下編寫出來的可以執行的**。

例如,要解決依次輸出一維陣列

中的資料元素的值的問題,首先想到的是使用迴圈結構( for 或者 while ),在有這個演算法的基礎上,開始編寫程式。

所以,演算法相當於是程式的雛形。當解決問題時,首先心中要有解決問題的演算法,圍繞演算法編寫出程式**。

對於乙個問題,想出解決的演算法,不一定就能解決這個問題。

例如擰螺母,扳手相對於鉗子來說更好使(選擇演算法的過程),但是在擰的過程(編寫程式的過程)中發現螺母生鏽擰不動,這時就需要另想辦法。

為了避免這種情況的發生,要充分全面地思考問題,盡可能地考慮到所有地可能情況,慎重選擇演算法(需要在實踐中不斷地積累經驗)。

對於乙個問題的演算法來說,之所以稱之為演算法,首先它必須能夠解決這個問題(稱為準確性)。其次,通過這個演算法編寫的程式要求在任何情況下不能崩潰(稱為健壯性)。

如果準確性和健壯性都滿足,接下來,就要考慮最重要的一點:通過演算法編寫的程式,執行的效率怎麼樣。

執行效率體現在兩方面:

好演算法的標準就是:在符合演算法本身的要求的基礎上,使用演算法編寫的程式執行的時間短,執行過程中占用的記憶體空間少,就可以稱這個演算法是「好演算法」。

計算乙個演算法的時間複雜度,不可能把所有的演算法都編寫出實際的程式出來讓計算機跑,這樣會做很多無用功,效率太低。實際採用的方法是估算演算法的時間複雜度。

在學習c語言的時候講過,程式由三種結構構成:順序結構、分支結構和迴圈結構。順序結構和分支結構中的每段**只執行一次;迴圈結構中的**的執行時間要看迴圈的次數。

由於是估算演算法的時間複雜度,相比而言,迴圈結構對演算法的執行時間影響更大。所以,演算法的時間複雜度,主要看演算法中使用到的迴圈結構中**迴圈的次數(稱為「頻度」)。次數越少,演算法的時間複雜度越低。

例如:a) ++x; s=0;

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

c) for (int i=1; i<=n; i++) }

上邊這個例子中,a **的執行了 1 次,b **的執行了 n 次,c **執行了 n*n 次。

演算法的時間複雜度的表示方式為:

o(頻度)

這種表示方式稱為大「o」記法

注意,是大寫的字母o,不是數字0
對於上邊的例子而言,a 的時間複雜度為o(1),b 的時間複雜度為o(n),c 的時間複雜度為為o(n2)

如果a、b、c組成一段程式,那麼演算法的時間複雜度為o(n2+n+1)。但這麼表示是不對的,還需要對n2+n+1進行簡化。

簡化的過程總結為3步:

所以,最終a、b和c合併而成的**的時間複雜度為o(n2)

列舉了幾種常見的演算法時間複雜度的比較(又小到大):

o(1)常數階<o(logn)對數階<o(n)線性階<o(n2)平方階<o(n3)(立方階)<o(2n) (指數階)

演算法的時間複雜度和空間複雜度是可以相互轉化的。

谷歌瀏覽器相比於其他的瀏覽器,執行速度要快。是因為它占用了更多的記憶體空間,以空間換取了時間。

演算法中,例如判斷某個年份是否為閏年時,如果想以時間換取空間,演算法思路就是:當給定乙個年份時,判斷該年份是否能被4或者400整除,如果可以,就是閏年。

如果想以空間換時間的話,判斷閏年的思路就是:把所有的年份先判斷出來,儲存在陣列中(年份和陣列下標對應),如果是閏年,陣列值是1,否則是0;當需要判斷某年是否為閏年時,直接看對應的陣列值是1還是0,不用計算就可以馬上知道。

演算法複雜度 時間複雜度和空間複雜度

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

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...