Big o 一段代码的大O符号复杂度计算

Big o 一段代码的大O符号复杂度计算,big-o,pascal,Big O,Pascal,请您解释一下如何计算以下细分市场的大O复杂性: i := n; while i > 1 do begin for j:= i div 2 + 1 to i do begin k := 2; while n >= k do k := k * k end; i := i div 2 end; (这是帕斯卡语,但语言在这里并不重要。) 正确的答案是n*log(log(n)),但我不知道如何

请您解释一下如何计算以下细分市场的大O复杂性:

i := n;
while i > 1 do
  begin
    for j:= i div 2 + 1 to i do
      begin
        k := 2;
        while n >= k do
          k := k * k
      end;
    i := i div 2
  end;
(这是帕斯卡语,但语言在这里并不重要。)
正确的答案是
n*log(log(n))
,但我不知道如何到达那里

从内部循环开始:

    k := 2;
    while n >= k do
      k := k * k
这将指定值2、22、24、28。。到
k
,直到到达
n
。这是O(log(log(n)),因为如果我们调用迭代次数m,它迭代到

22m > n → log(22m) > log(n) → log(log(22m)) > log(log(n)) → → m > log(log(n)) → m = log(log(n)) + 1 这有i/2迭代,所以它是O((i/2)log(log(n)))

这有O((i/2)log(log(n))的O(log(n))次迭代,其总和为

O( (n/2) log(log(n)) + (n/4) log(log(n)) + (n/8) log(log(n)) + (n/16) log(log(n)) + ... ) = = O( (1/2 + 1/4 + 1/8 + 1/16 + ...) n log(log(n)) ) = = O( 0.1111111…2 n log(log(n)) ) = = O( n log(log(n)) ) O((n/2)log(log(n))+(n/4)log(log(n))+(n/8)log(log(n))+(n/16)log(log(n))+…)= =O((1/2+1/4+1/8+1/16+…)n对数(对数(n)))= =O(0.1111111…2N对数(对数(n)))= =O(n对数(对数(n)))
(0.11111…2=1,就像0.999…10=1一样,但这在O()中并不重要)

真的
n*log(log(n))
?我本以为
n*log(n)²
。这是我考试的一部分,老师把n*log(log(n))标记为正确的解决方案。哦,对了,现在我看到了。
i := n;
while i > 1 do
  begin
    // (i / 2) log(log(n))
    i := i div 2
  end;
O( (n/2) log(log(n)) + (n/4) log(log(n)) + (n/8) log(log(n)) + (n/16) log(log(n)) + ... ) = = O( (1/2 + 1/4 + 1/8 + 1/16 + ...) n log(log(n)) ) = = O( 0.1111111…2 n log(log(n)) ) = = O( n log(log(n)) )