簡體   English   中英

該算法的時間復雜度是多少?

[英]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 2log base 2是您必須將n除以2才能得到1

這也是一個嚴格的界限,即代碼也是Θ(n^2 * log(n))

誰給您這個問題,幾乎可以肯定是在尋找答案n^2 log(n) ,這是由其他人解釋的原因。

但是,這個問題實際上沒有任何意義。 如果n > 2^30 ,則k將溢出,從而使內部循環變為無限。

即使我們將這個問題完全視為理論問題,並假設nkcount不是Java int s,而是某種理論上的整數類型,答案n^2 log n假定++*=操作具有恆定時間復雜度,無論需要多少位來表示整數。 這個假設不是真的成立。

更新資料

有人向我指出在下面的意見,基於硬件的工作方式,這合理的假設, ++*=2<都有固定的時間復雜度,無論需要多少位。 這使我的答案的第三段無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM