首先一點就是無視任何常量
從最簡單的開始
statement;
這段時間復雜度為常數1,所以O(1).
然后
for ( i = 0; i < N; i++ ) statement;
這一段是線性的,則時間復雜度為N,所以O(N),就算運行多次,比如4次5次,5N依然看做O(N).
但是
for ( i = 0; i < N; i++ ) { for ( j = 0; j < N; j++ ) statement; }
這一段則是二次的,不是二次元,是二次quadratic,這一段的運行次數為N*N,所以O(N^2).
再一個例子
while ( low <= high ) { mid = ( low + high ) / 2; if ( target < list[mid] ) high = mid - 1; else if ( target > list[mid] ) low = mid + 1; else break; }
這一段是對數的Logarithmic,有點難理解吧,就是說以上的例子每次都要找到中間的部分,那么中間的部分找到后,整個size就一分為二,只用管其中的一半即可.考慮到整個list的size,我們假設這個size為X,那么以上的步驟要重復Y次才能達到X,介於每次都是取一半丟一半,那么可以說2^Y=X,因為計算機理論方面習慣吧底數為2的省略(數學里面則是底數為10的省略,略寫為lg),所以其實運行次數Y=logX,也就是O(logN).
我們帶幾個例子來看對不對,比如我們有一個size為8的list,看看是不是需要3次就能讓中間值固定下來.size為8的話,想象一個完美的例子1,2,3,4,5,6,7,8.中間值為(1+8)/2=4, target為4,然后取一半,選多的一半,則是4,5,6,7,8這邊,中間值為6,再選一半,6,7,8,中間值為7,找到.以上找中間值的步驟重復了3次,剛好是我們期望中的次數.
以上例子再升級
void quicksort ( int list[], int left, int right ) { int pivot = partition ( list, left, right ); quicksort ( list, left, pivot - 1 ); quicksort ( list, pivot + 1, right ); }
就是我們通常了解的quicksort,因為多嵌套了一個iteration,所以整個運行次數為N*log(N).那么big O為O(nlog(n)).