Big o 两个不寻常循环的大O复杂性?
我有两段独立的代码,需要计算它们的大O复杂性。第一个是:Big o 两个不寻常循环的大O复杂性?,big-o,time-complexity,pascal,Big O,Time Complexity,Pascal,我有两段独立的代码,需要计算它们的大O复杂性。第一个是: k:=1; s := 4; while k < N do begin k := 2 * k; m:=1; while m < N do begin for i := m to 2*m-1 do s := s + 2; m := m + m; end; end; 第二个的正确答案是n*n。我的数学好像不对劲。如果你能帮助其中任何一个,那将是巨大的帮助 让我们看
k:=1;
s := 4;
while k < N do
begin
k := 2 * k;
m:=1;
while m < N do
begin
for i := m to 2*m-1 do s := s + 2;
m := m + m;
end;
end;
第二个的正确答案是n*n。我的数学好像不对劲。如果你能帮助其中任何一个,那将是巨大的帮助 让我们看一下第一段代码:
k := 1;
s := 4;
while k < N do
begin
k := 2 * k;
m := 1;
while m < N do
begin
for i := m to 2*m-1 do s := s + 2;
m := m + m;
end;
end;
m := 1;
FOR i := n downto 1 do
BEGIN
m := m * 2;
y := i MOD 2;
x := m;
WHILE x > y DO
BEGIN
x := x DIV 2;
y := y*2
END
END
与前面一样,请注意变量m
在每次迭代中都会加倍。这可能值得注意,因为m的值将是1、2、4、8、16、32、64等。更一般地说,在迭代i
时,m
的值为2i
现在,让我们看看这个内部循环将做多少工作。请注意,x
从m
的值开始,即2i。在循环的每次迭代中,x都会减少两倍。这意味着此循环的最大可能迭代次数为logm=log2i=i
。这当然很好,因为这意味着内部循环最多只能运行i
次
一旦我们有了它,确定运行时就不是很难了。因为我从N倒数到0,所以完成的总功最多为
n+(n-1)+(n-2)+…+2+1=O(n2)
因此,运行时为O(n2)
希望这有帮助
m := 1;
FOR i := n downto 1 do
BEGIN
m := m * 2;
y := i MOD 2;
x := m;
WHILE x > y DO
BEGIN
x := x DIV 2;
y := y*2
END
END