演算法,作為乙個programmer應該再清楚不過。乙個演算法的好壞是依靠什麼標準 來評判的呢?那就是時間複雜度和空間複雜度。
今天就來**下時間複雜度,什麼是時間複雜度呢?
在電腦科學中,時間複雜性,又稱時間複雜度,演算法的時間複雜度是乙個函式,它定性描述該演算法的執行時間。這是乙個代表演算法輸入值的字串的長度的函
數。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的
直接這麼看太過晦澀難以理解,我們可以拆分成各個知識小塊來理解,然後再回頭看就會恍然大悟。
我們假設計算機執行一行基礎**需要執行一次運算。
int
afunc
(void
)
int
afunc
(int n)
return0;
// 需要執行 1 次
//總共是 n + 1 + (n * 1) + 1 = 2n + 2次運算
}
時間頻度相信大家都有所認識了。但是在相同**中,不同輸入值仍可能造成演算法的執行時間不同,因此我們通常使用演算法的最壞情況複雜度,記為t(n),定義為任何大小的輸入n所需的最大時間頻度。(這是只考慮一種演算法中時間頻度多的那種情況)
時間頻度 t(n)的幾種自然特性:
線性:t(n) = 3n
void
afunc
(int n)
//總共是(1 * n) + (1 * n) + (1 * n) = 3n次運算
}
對數:t(n) = 2logn
擴充知識點:對數函式
void
afunc
(int n)
//總共是logn + logn = 2logn次運算
}
常數:t(n) = 1
void
afunc
(int n)
//無論n是多少,程式都只執行一次
多項式:t(n) = 0.5n² + 0.5n
擴充知識點:等差數列
void
afunc
(int n)
system.out.
println
("hello world!");
//需要執行n * 1次}}
//總共是(1 + 2 + n-2 + n-1) + n = n(n + 1)/2 = 0.5n² + 0.5n次運算
相信現在大家應該對時間複雜度有所理解,但是別著急,我們繼續往下看。
大o表示法:演算法的時間複雜度通常用大o符號表述,定義為t[n] = o(f(n))。稱函式t(n)以f(n)為界或者稱t(n)受限於f(n)。 如果乙個問題的規模是n,
解這一問題的某一演算法所需要的時間為t(n)。t(n)稱為這一演算法的「時間複雜度」。當輸入量n逐漸加大時,時間複雜度的極限情形稱為演算法的「漸近時間復
看到這是否有同學不理解了。我先舉個例子:現在假設有一段**的時間頻度為t(n) = n + 2,又有某個輔助函式f(n) = n²,當n趨近於無窮大時,t(n) / f (n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),而o(f(n))則 為演算法的漸進時間複雜度,簡稱時間複雜度。
在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如t(n) = n + 2與t(n) = n + 4它們的頻度不同,但時間複雜度相同,都為o(f(n))。
在明白了什麼是時間複雜度之後,我們還需要了解如何計算時間複雜度。
1、省略常數項
int
afunc
(void
)//t(n) = 2n 時間複雜度為 o(n)
2、忽略低次項
//t(n) = n² + n 時間複雜度為 o(n²)
3、只保留最高次項,同時忽略最高項的係數
void
afunc
(int n)
system.out.
println
("hello world!");
//需要執行n * 1次}}
//t(n) = 0.5n² + 0.5n 時間複雜度為 o(n²)
總結:如果乙個演算法的執行次數是 t(n),那麼只保留最高次項,同時忽略最高項的係數後得到函式 f(n),此時演算法的時間複雜度就是 o(f(n))。無論是順序執行的演算法還是含有條件判斷的演算法,我們都按演算法最壞情況複雜度來計算。如果涉及到函式呼叫,則需要把呼叫的函式一併按照上面的規則加進去來計算時間複雜度。
大家可以自己嘗試著來算一算自己寫的演算法的時間複雜度是多少,從而進一步的加深對時間複雜度的理解,也能有目的性的去設計自己的演算法。
一套圖 搞懂「時間複雜度」
時間複雜度
大o表示法
時間複雜度 解析
通常是用 大 o big o 表示法,來表示時間最壞複雜度 公式t n o f n f n 既函式總執行次數 推導大o階方法 1.用常數 1 取代執行時間中的所有加法常數 2.在修改後的執行次數函式中,只保留最高端 3.如果最高端存在且不是 1 則去除與這個項相乘的常數 常數階 o 1 示例 int...
解析時間複雜度和空間複雜度
說明 時間複雜度和空間複雜度從字面上理解 時間複雜度 時間複雜度的表示方法 一般用大o符號表示法表示,o f n n是影響複雜度變化的因子,f n 是複雜度的演算法。這個表示方法不是具體的運算時間,而是 執行時間的增長變化趨勢。隨著n的增長,演算法的執行運算時間增長速度記為f n 常見的時間複雜度量...
時間複雜度深度解析
從字面解析,就是乙個演算法執行的時間,很多小夥伴都想到了把演算法程式執行一遍,那麼消耗的時間就自然而然的知道了,這種方式是可以的,但是有很多的弊端,很容易受到執行環境的影響,效能的高低相差很大,對使用的資料規模也有關係。所以還是不能完整的去執行它。這樣一種通用的方式就誕生了,大o符號表示法 在 大o...