[英]What is the time complexity for this algorithm?
public static void Comp(int n)
{
int count=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=1;k<n;k*=2)
{
count++;
}
}
}
System.out.println(count);
}
有誰知道時間的復雜度是多少?
什么是大Oh()
請您逐步向我解釋一下嗎?
時間復雜度為O(n^2 log n)
。 為什么? 每個for循環都是n
的函數。 對於每個for循環,您都必須乘以n; 除了作為log n增長的內部循環。 為什么? 對於每次迭代,k都將乘以2。考慮合並排序或二叉搜索樹。
細節
對於前兩個循環:1從0到n的和,即n + 1,因此前兩個循環給出(n+1)*(n+1)= n^2+2n+1= O(n^2)
對於k循環,我們有k增長為1,2,4,8,16,32,...,因此2 ^ k = n。 取雙方的對數,您將得到k=log n
同樣,不清楚嗎?
因此,如果我們將m=0
設置m=0
a=2
那么我們得到-2^n/-1
為什么a = 2? 因為那是一個值,該序列可得出2,4,8,16,... 2 ^ k
理論上,這是O(n^2 * log(n))
。
兩個外部循環中的每個循環均為O(n)
,內部兩個循環為O(n)
O(log(n))
,因為n
的對數以log base 2
為log base 2
是您必須將n
除以2
才能得到1
。
這也是一個嚴格的界限,即代碼也是Θ(n^2 * log(n))
誰給您這個問題,幾乎可以肯定是在尋找答案n^2 log(n)
,這是由其他人解釋的原因。
但是,這個問題實際上沒有任何意義。 如果n > 2^30
,則k
將溢出,從而使內部循環變為無限。
即使我們將這個問題完全視為理論問題,並假設n
, k
和count
不是Java int
s,而是某種理論上的整數類型,答案n^2 log n
假定++
和*=
操作具有恆定時間復雜度,無論需要多少位來表示整數。 這個假設不是真的成立。
有人向我指出在下面的意見,基於硬件的工作方式,這是合理的假設, ++
, *=2
和<
都有固定的時間復雜度,無論需要多少位。 這使我的答案的第三段無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.