Big o 一段代码的大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)),但我不知道如何
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)) )