2010-06-04 31 views
1

我仍在學習使用Big O Notation進行復雜度測量,想知道是否正確地說,下面的方法的複雜性是O(n * log4n),其中「4」是下標。以下方法的複雜程度如何?

public static void f(int n) 
{ 
    for (int i=n; i>0; i--) 
    { 
     int j = n; 
     while (j>0) 
      j = j/4; 
    } 
} 
+1

通常你會只寫O(N日誌(N)),無視標。 – 2010-06-04 17:08:41

+0

常量通常退出我以爲..所以你不寫O(n日誌4n)你只會寫O(n日誌n)(如果這確實是正確的) – bwawok 2010-06-04 17:09:14

回答

6

是的,你是正確的,該功能的複雜性是O(n*log_4(n))

Log_4(n) = ln(n)/ln(4)ln(4)是恆定的,所以如果你的函數具有複雜O(n*log_4(n))這也是事實,它具有的複雜性O(n*ln(n))

3

您的意思是

public static void f(int n) 
{ 
    for (int i=n; i>0; i--) 
    { 
     int j = i; // Not j = n. 
     while (j>0) 
      j = j/4; 
    } 
} 

在這種情況下,你也是對的。它是O(nlogn)。使用4作爲下標也是正確的,但它只會使編寫起來更加麻煩。

即使使用j=n一行,也是O(nlogn)。

事實上,要更準確地說,你可以說它是Theta(n logn)。

+2

我不認爲使用4作爲下標是正確,因爲它和寫一個常量是一樣的:'log4(n)= log(n)/ log(4)' – IVlad 2010-06-04 17:22:06

+1

@IVlad:它仍然是正確的。像O(2n)或O(n^2 + 3n + 45)這樣說是正確的。這只是另一個功能,我們通常避免使用常量來簡化讀/寫/理解。在那裏有常量是煩人的,但不是不正確的。 – 2010-06-04 17:24:31

+0

@Moron - 我看到的每一段文字都說你不會把常量或低等級項放在大哦,所以'O(2n)'不正確,它應該是'O(n)',你的第二個例如應該是'O(n^2)'。維基百科和http://www.perlmonks.org/?node_id=227909似乎都暗示了這一點:「當你看到O(2N)或O(10 + 5N)時,有人正在將實現細節融入到概念的細節中。你能提供一個參考來更詳細地討論這個問題嗎? – IVlad 2010-06-04 17:32:55

1

是的,你是對的,複雜就是n * LOG4(N)