對於算法分析最重要的是分析運行時間。在影響程序運行時間的因素中,除了某些超出全部理論模型範疇的因素諸如所使用的編譯器和計算器以外,主要的影響因素是所使用的算法和對該算法的輸入。算法
爲了對運算時間進行簡化分析,咱們採用約定:不存在特定的時間單位。所以咱們拋棄一些前導的常數和低階項,從而計算大O的運行時間,因爲大O是上界,毫不要低估程序的運行時間。測試
例:計算∑ i³編譯器
public static int sum(int n){for循環
int sum;編譯
⑴ sum = 0;循環
⑵ for(int i = 1; i <= n; i++){程序
⑶ sum += i * i * i; 方法
}static
⑷ return sum;時間
}
分析:全部的聲明均不計時間。第一行賦值語句和第四行返回值語句各佔一個時間單位。第三行運行一次佔4各時間單位(一次賦值,兩次乘法,一次加法),總共運行N次佔4N個時間單位。第二行佔(一次賦值,N+1次比較,N次自加)共2N+2個時間單位。忽略調用方法和返回值的開銷,獲得總量是6N+4個時間單位。所以咱們說該方法是O(N)的。
因爲咱們有了大O的結果,所以就存在許多能夠採起捷徑而不影響最後運行結果的方法。例如在第三行中咱們無需知道運行一次到底佔幾個時間單位,咱們只要知道它是O(1)的就行,至於賦值語句等與for循環比起能夠忽略最後獲得的結果仍是O(N)。因此爲了簡化分析,咱們沒必要計較具體開銷,這使得咱們獲得通常法則。
法則一——for循環:
一個for循環運行時間至可能是該for循環內部那些語句(包括測試)的運行時間乘以迭代次數。通常狀況下因爲大O內部任何簡化都是可能的,因此通常簡單的for循環獲得的結果是O(N)的。
法則二——嵌套的for循環:
從裏向外分析循環。在一組嵌套循環內部的一條語句運行時間爲該語句的運行時間乘以該組全部的for循環大小的乘積。例如雙重for循環內部有一條賦值語句,則結果爲O(N²)。
法則三——順序語句:
將各個語句的運行時間求和便可。(O(f(N))+O(g(N))= max(O(f(N)),O(g(N))
法則四——if / else語句:
對於程序片斷
if(條件)
語句
else
語句
一個if / else語句的運行時間不會超過判斷的運行時間加上兩個語句中運行時間較長的那個語句的運行時間。