Bla*_*Art 1 algorithm math big-o recurrence asymptotic-complexity
n函数的输入在哪里可以是任何整数.
i = n, total = 0;
while (i > 0) {
for (j=0; j<i; j++)
for (k=0; k<i; k++)
total++;
i = i/4;
}
Run Code Online (Sandbox Code Playgroud)
这个函数的时间复杂度是多少?
考虑这个问题的一种方法是独立查看循环.
这个内循环嵌套:
for (j=0; j<i; j++)
for (k=0; k<i; k++)
total++;
Run Code Online (Sandbox Code Playgroud)
将执行总共Θ(i 2)次操作,因为每个循环独立地运行i次.
现在,让我们看一下外循环:
while (i > 0) {
/* do Theta(i^2) work */
i = i/4;
}
Run Code Online (Sandbox Code Playgroud)
这个循环总共运行最多1 + log 4次,因为在每次迭代时我被减少1/4,这在i降到零之前只能发生1 + log 4次.那么,问题是将完成多少工作.
解决此问题的一种方法是为完成的总工作写一个简单的递归关系.我们可以将循环视为尾递归函数,其中每次迭代都使Θ(i 2)起作用,然后对大小为4的子问题进行递归调用.这会导致重复:
T(n)= T(n/4)+Θ(n 2).
应用主定理,我们看到a = 1,b = 4,c = 2.由于log b a = log 4 1 = 0且0 <c,主定理说(按案例3)运行时解决了Θ(n 2).因此,完成的总工作是Θ(n 2).
这是考虑这一点的另一种方式.循环的第一次迭代确实ñ 2的工作.下一确实(N/4)2 = N 2 /的1/16.下一确实(N/64)2 = N 2 /256个工作.事实上,迭代X循环会做ñ 2 /16个X的工作.因此,完成的工作总数由
n 2(1 + 1/16 + 1/16 2 + 1/16 3 + ...)
≤Ñ 2(1 /(1 - 1/16))
=Θ(n 2)
(这使用无穷几何级数之和的公式).
希望这可以帮助!