我对Big O有疑问:
for i:=1 to n do
for j:=1 to i*i do
begin
k:=1; m:=n;
while m>=k do
begin
k:=k*3;
m:=m/2
end
end
老师给出了答案 - n * n * n * log(n)。但是,我无法到达那里。那应该是记录基础2.请帮助。
答案 0 :(得分:4)
在这里,您可以看到零件的来源:
for i:=1 to n do <-- n
for j:=1 to i*i do <-- n*n
begin
k:=1; m:=n;
while m>=k do <-- log(n)
begin /
k:=k*3; /
m:=m/2 <--+
end
end
循环是嵌套的,因此你可以将它们的复杂性相乘
要理解基础2日志,让我们从一个更简单的例子开始:
while m>=k do
begin
k:=k*2;
m:=m/2
end
这个循环完全运行⌈(log n)/2⌉
次(基数2),因为在一半的时间之后,简单地说m和k在中间(当然不是确切的中间!)相遇。在Big-O中忽略常数因子0.5
。
对于k:=k*3
,情况类似,但结果将介于(log n)/2
(基数3)和(log n)/2
(基数2)之间。
我会把数学留给你,但你会明白m:=m/2
更重要,因为它从上到下开始。