Algorithm 挑战大O
我对大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 <--
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中不重要。我用较少的数学解释编辑了答案,但我刚刚意识到,这是非常不必要的:)