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

2022-07-07 20:00:17 字數 2063 閱讀 5303

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

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

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

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

例如,要解決依次輸出一維陣列中的資料元素的值的問題,首先想到的是使用迴圈結構( 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 演算法o n 關注n的階數,當數十分大的時候,常數可以忽略。o n 又稱為大o記法。2 t n o f n 隨著n變化而變化,f n 是某個函式,執行的次數等於時間,一般情況下,t n 增長最慢的演算法最優。4 推到o n 1,用1取代時間中所有加法常數 哪些可以忽略 2,在修改後的執行函式中,...

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

通常我們衡量乙個演算法的複雜度時,會有兩種演算法效率分析方式 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,空間複雜度主要衡量一乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜...