1. 程式人生 > 實用技巧 >C語言的時間複雜度與空間複雜度

C語言的時間複雜度與空間複雜度

昨天簡單提到時間複雜度和空間複雜度,今天我們要詳細的談一談時間複雜度和空間複雜度的計算方法。(所有的圖都來自B站小甲魚老師的課程)。

首先要強調的是,研究演算法的複雜度,側重研究演算法隨著輸入規模擴大增長量的一個抽象,而不是精確地知道需要執行多少次,只是為了比較我們使用哪一個演算法更優。

先來談談演算法的好壞吧!
例如:第一種演算法迴圈執行了2n+2次;第二種演算法迴圈執行了2次,那麼這兩種演算法我們就可以把它當作其實就是n和1的差距,只需要知道哪種演算法更好就行,不需要死算究竟差了多少次!!
再例如下面這段程式是兩層迴圈,外層迴圈每執行1次,內層迴圈都需要執行100次,所以這段程式總共需要執行100*100次。[時間複雜度就是O(100^2)](繼續往下看你就明白了)

如果n更大,如果精確的算它需要執行多少次,那是非常累的!
在這裡插入圖片描述
我們在分析一個演算法的執行時間時,重要的是把基本操作的數量和輸入模式關聯起來。
在這裡插入圖片描述
從上圖中可以看出,隨著n的繼續增加,演算法A1比演算法B1逐漸優秀。
在這裡插入圖片描述
從上面這個圖中我們可以看出,演算法A1和A2(B1和B2)曲線基本重合,所以說明常數我們可以基本忽略不計。
在這裡插入圖片描述
從上圖發現,演算法的好與壞與n前面相乘的係數關係不大,也就是說,演算法中最高次項前面的常數並不重要。
在這裡插入圖片描述
從上圖中可以看出,隨著n的增長,演算法的好壞與最高次項的指數關係更大。

總結:判斷一個演算法的效率時,函式的常數和其他次要項常常可以忽略,更應該關注最高項的階數(最高次冪)

時間複雜度
演算法的時間複雜度,也就是演算法的時間量度,記作:
T(n)=O(f(n))。表示:隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱作演算法的時間複雜度。其中f(n)是問題規模n的函式。
一般情況下,隨著輸入規模n的增大,T(n)的增長最慢的演算法為最優演算法。
如何分析一個演算法的時間複雜度?
——用常數1取代執行時間中的所有加法常數。
——在修改後的執行次數函式中,只保留最高階項。
——如果最高階項存在且不是1,則去除與這個項相乘的常數。

簡單的說,算時間複雜度就看演算法中需要執行多少次。比如:
——常數階:執行1次、8次、10次,凡是執行次數能用常數表示出來的,都記為O(1);

——線性階:執行n次,則記為O(n)
——平方階:(一般為兩層迴圈),假設外層迴圈n次,內層也迴圈n次,則時間複雜度為O(n^2)因為外層每迴圈一次,內層都要迴圈n次。
那麼立方階呢?當然是O(n^3)了

在這裡插入圖片描述
在這裡插入圖片描述
上面的儘量要熟知!
演算法的空間複雜度:
演算法的空間複雜度計算公式為:
S(n)=O(f(n)),n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。
通常用“時間複雜度”☞執行時間的需求,用“空間複雜度”☞空間需求。
如果考試讓求“複雜度”,通常☞時間複雜度。