時間複雜度
在進行演算法分析時,執行演算法在最壞的情況下所需要的時間稱之為時間複雜度。使用big o notation表示。
一般使用大寫o()來體現演算法時間複雜度的記法,我們稱之為大o記法。一般情況下,隨著n的增大,t(n)增長最慢的演算法為最優演算法。
常用的表示
o(1):constant complexity :constant 常量複雜度
o(log n) :logarithmic complexity:對數複雜度
o(n):linear complexity:線性複雜度
o(n^2):n-square complexity:平方
o(n^3):n-cube complexity:立方
o(2^n):exponential growth:指數
o(n!):factorial:階乘
只看最高複雜度的運算
時間複雜度從小到大為(越小越好):
o(1)最壞時間複雜度是應用執行的保證,而平均時間複雜度則是最有意義的,因為它是期望的執行時間。
時間複雜度的計算
(1)找出演算法中重複執行次數最多的語句的頻度來估算演算法的時間複雜度;
(2)保留演算法的最高次冪,忽略所有低次冪和高次冪的係數;
(3)將演算法執行次數的數量級放入大ο記號中。
例如,下列三個簡單的程式段:
在程式段(a)中,語句x=x+1不在任何乙個迴圈體內,則它的時間頻度為1,其執行時間是個常量;而(b)中,同一語句被重複執行n次,其時間頻度為n;顯然在(c)中,該語句的頻度為n2。由此,這三個程式段的時間複雜度為o(1)、o(n)、o(n2)。分別為常量、線性階和平方階。
對於較為複雜的演算法,可以將它們分割成容易估算的幾個部分,然後利用o的求和原則得到整個演算法的時間複雜度。例如,若演算法的兩個部分的時間複雜度分別為t1(n)=o(f(n))和t2(n)=o(g(n)),則總的時間複雜度為:
t(n)= t1(n)+ t2(n)=o(max(f(n), g(n)))
然而,很多演算法的執行時間不僅依賴於問題的規模,也與處理的資料集有關。例如,有的排序演算法對某些原始資料(如自小至大有序),則其時間複雜度為o(n),而對另一些資料可達o(n^2)。因此,在估算演算法的時間複雜度時,均以資料集中最壞的情況來估算。
空間複雜度
乙個程式的空間複雜度是指執行完乙個程式所需記憶體的大小。利用程式的空間複雜度,可以對程式的執行所需要的記憶體多少有個預先估計。乙個程式執行時除了需要儲存空間和儲存本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些為現實計算所需資訊的輔助空間。程式執行時所需儲存空間包括以下兩部分。
(1)固定部分。這部分空間的大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(即**空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。
(2)可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。
時間複雜度vs空間複雜度:
演算法複雜度分為時間複雜度和空間複雜度。其作用: 時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。(演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即暫存器)資源,因此複雜度分為時間和空間複雜度)。
就目前來說,除了在一些特殊情況下,我們都是更加注重時間複雜度,而不是空間複雜度。注意,這裡我們強調了,除了一些特殊情況外,有些特殊情況下,空間複雜度可能會更加重要。
參考:
如何學習資料結構和演算法
首先掌握常用的 基礎的。然後在此基礎上往進行擴充套件學習。常用的 基礎的資料結構和演算法有20個。資料結構 陣列 鍊錶 棧 佇列 雜湊表 二叉樹 堆 跳表 圖 trie樹 演算法 遞迴 排序 二分查詢 搜尋 雜湊演算法 貪心演算法 分治演算法 回溯演算法 動態規劃 字串匹配演算法。這些需要一一攻克。...
資料結構和演算法
判斷乙個演算法的效率時,函式中的常數和其它次要項常常可以忽略,而更應該關注主項 最高項 的階數。演算法時間複雜度的定義 在進行演算法分析時,語句中的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n ...
資料結構和演算法
程式是什麼?好多書上都寫著 程式 資料結構 演算法。可是怎麼去理解呢?好多程式設計人員對資料結構和演算法說不上熟悉,因為在他們所從事的工作中很少用到這些知識點。但並不表示他們不重要。還有一些人是這樣的想法 大公司才會注重這些知識點,小公司可能就不注重了。寫這篇文章之前我也是持這種想法的。但是,此時此...