根據此代碼:以下代碼的複雜程度如何?
for (int i=1; i<=N; i*=2)
{
for (int j=1;j<=i;j++)
{
System.out.println("The value for i is "+i+" and the value for j is "+j);
}
}
第一for-loop
將首先運行log(n)
倍, 我想到2n-1
第二for-loop
,但它並不適用於奇數工作。
任何想法? :)
根據此代碼:以下代碼的複雜程度如何?
for (int i=1; i<=N; i*=2)
{
for (int j=1;j<=i;j++)
{
System.out.println("The value for i is "+i+" and the value for j is "+j);
}
}
第一for-loop
將首先運行log(n)
倍, 我想到2n-1
第二for-loop
,但它並不適用於奇數工作。
任何想法? :)
你的第一個for循環得到了i
作爲一個系列:
x
看臺:當這個系列的最後一個元素是比格爾或等於n,
第一循環停止第一個循環執行多少次。現在,我們正在努力尋找x
:
其中
是的,它是如你所說:
第一個for循環運行的log(n )次
第二個for循環體運行的總和:
這證明你的算法有O(n)的複雜性
您的打印發生2N-1
時候,如果N是1: 1, 2, 4, 8, ... , 2^n
這是表面分析,但它做的工作。
i = 1
,內環將運行1次i = 2
,內環將運行2次i = 4
,內環將運行4次i = N
,內環將運行N次打印語句執行1 + ... + N/4 + N/2 + N
次,這是O(n)。
'O(n)'是正確的,但是這個證明(這種證明形式)只適用於'2^n-1' –
@DmitryGinzburg從上面和下面通過下一個2的冪來界定。 –
@ G.Bach值得一提的答案 –
這是第一個循環執行的次數('log(n)')乘以第二個循環執行的次數('i')。 – Charlie
你想要漸近複雜性還是迭代次數?漸近線是n * log(n) –
我需要考慮任何一行的迭代次數,而不是找到O符號。 – user3813409