Big 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。我的数学好像不对劲。如果你能帮助其中任何一个,那将是巨大的帮助 让我们看

我有两段独立的代码,需要计算它们的大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;
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