依赖嵌套的运行时分析

问题描述 投票:0回答:2

0

这里是算法:

int sum = 0
for (int i = 2N; i > 0; i = i / 4) 
  for (int j = 0; j < i; j+=2) 
    sum++
  end for
end for

我认为这是线性的,但只是线性的。我希望看到正式的总结而不是定性的解释。我已经尝试过这样做,但是我无法获得线性运行时。

algorithm runtime analysis
2个回答
1
投票

在第一次外部迭代中,总和增加约N次,在第二次-大约N / 4次,然后大约N / 16次,依此类推。因此总数大约N + N / 4 + N / 16 + N / 64 + ...,相当于4N / 3

您可以以更正式的方式轻松地证明它,但是对于SO社区而言,这将是没用的。因此,您的复杂度只是线性的。


0
投票

切成小块:

int sum = 0

这里有O(1)。

for (int i = 2N; i > 0; i = i / 4) 

这将运行多少次?假设它将运行k次并评估k:

2N / 4 ^ k = 1 => 2N = 4 ^ k => k = log4(2N)。为简化起见,我们仅调用k = lg(N)。

for (int j = 0; j < i; j+=2) 
    sum++
end for

在第一种情况下,此运算直到N,然后是N / 4,然后是N / 16,等等。>>

这给您的是:

∑(N / 4 ^ i),i = 0 ... k =

N * ∑ 1/4 ^ i,i = 0 ... k

∑ 1/4 ^ i,i = 0 ... k是小于4/3的级数,因为它停在k = lg(n),因为外循环只运行lg(n)次。 >

因此,复杂度为O(X <4/3 * N),因此是线性的。

© www.soinside.com 2019 - 2024. All rights reserved.