Algorithm 挑战大O

Algorithm 挑战大O,algorithm,big-o,Algorithm,Big O,我对大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的对数。请帮助。在这里您可以看到零件的来源: for i:=1 to n do <-- n for j:=1 to i*i do <--

我对大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的对数。请帮助。

在这里您可以看到零件的来源:

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⌉时间(基数2),因为简单的说M和K在一半的时间(当然不是中间的中间)相遇。常量系数
0.5
在大O中被忽略。 对于
k:=k*3
情况类似,但结果将介于
(对数n)/2
(基数3)和
(对数n)/2
(基数2)之间。
我将把数学留给你,但你会明白,
m:=m/2
更重要,因为它从上到下开始

在这里您可以看到零件的来源:

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⌉时间(基数2),因为简单的说M和K在一半的时间(当然不是中间的中间)相遇。常量系数
0.5
在大O中被忽略。 对于
k:=k*3
情况类似,但结果将介于
(对数n)/2
(基数3)和
(对数n)/2
(基数2)之间。
我将把数学留给你,但你会明白,
m:=m/2
更重要,因为它从上到下开始

你明白答案的任何部分吗?你明白答案的任何部分吗?我不明白为什么它有对数(n)的复杂性。问题是“k:=k*3;”。在我看来,复杂性是log(n),但以6为基础!因为
log_b(n)
基本上等于
log_b(2^log(n))=log_b(2^(log_b(2))^log(n))=log_b(2^(log_b(2))*log(n))=log_b(2)*log(n)
log_b(2)
是一个常量因子,在大范围内可以忽略-O@BeniBela:很好的解释了为什么基数在big-O中不重要。我用较少的数学解释编辑了答案,但我刚刚意识到,这是非常不必要的:)我不明白为什么会有log(n)复杂性。问题是“k:=k*3;”。在我看来,复杂性是log(n),但以6为基础!因为
log_b(n)
基本上等于
log_b(2^log(n))=log_b(2^(log_b(2))^log(n))=log_b(2^(log_b(2))*log(n))=log_b(2)*log(n)
log_b(2)
是一个常量因子,在大范围内可以忽略-O@BeniBela:很好的解释了为什么基数在big-O中不重要。我用较少的数学解释编辑了答案,但我刚刚意识到,这是非常不必要的:)