[算法基礎]Big O Notation時間復雜度計算方法


首先一點就是無視任何常量

從最簡單的開始

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)).

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM