挑战大O.

时间:2013-02-01 23:42:07

标签: algorithm big-o

我对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.请帮助。

1 个答案:

答案 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更重要,因为它从上到下开始。