我仍在學習使用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;
}
}
我仍在學習使用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;
}
}
是的,你是正確的,該功能的複雜性是O(n*log_4(n))
Log_4(n) = ln(n)/ln(4)
和ln(4)
是恆定的,所以如果你的函數具有複雜O(n*log_4(n))
這也是事實,它具有的複雜性O(n*ln(n))
您的意思是
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)。
我不認爲使用4作爲下標是正確,因爲它和寫一個常量是一樣的:'log4(n)= log(n)/ log(4)' – IVlad 2010-06-04 17:22:06
@IVlad:它仍然是正確的。像O(2n)或O(n^2 + 3n + 45)這樣說是正確的。這只是另一個功能,我們通常避免使用常量來簡化讀/寫/理解。在那裏有常量是煩人的,但不是不正確的。 – 2010-06-04 17:24:31
@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
是的,你是對的,複雜就是n * LOG4(N)
通常你會只寫O(N日誌(N)),無視標。 – 2010-06-04 17:08:41
常量通常退出我以爲..所以你不寫O(n日誌4n)你只會寫O(n日誌n)(如果這確實是正確的) – bwawok 2010-06-04 17:09:14