循环的大O分析

Sar*_*Byl 17 algorithm big-o loops for-loop

我必须分析这个循环,并使用Big-O表示法确定其运行时间.

for ( int i = 0; i < n; i += 4 )
    for ( int j = 0; j < n; j++ )
        for ( int k = 1; k < j*j; k *= 2 )`
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所拥有的:

for ( int i = 0; i < n; i += 4 ) = n
Run Code Online (Sandbox Code Playgroud)
for ( int j = 0; j < n; j++ ) = n
Run Code Online (Sandbox Code Playgroud)
for ( int k = 1; k < j*j; k *= 2 ) = log^2 n
Run Code Online (Sandbox Code Playgroud)

现在我遇到的问题是循环的最终运行时间.我最好的猜测是O(n ^ 2),但我不确定这是否正确.有人可以帮忙吗?

编辑:抱歉哦 - > O的事.我的教科书使用"Big-Oh"

izo*_*ica 18

首先请注意,外部循环与其余两个独立 - 它只是添加一个(n/4)*乘数.我们稍后会考虑.

现在让我们考虑一下它的复杂性

for ( int j = 0; j < n; j++ )
    for ( int k = 1; k < j*j; k *= 2 )
Run Code Online (Sandbox Code Playgroud)

我们有以下总和:

0 + log 2(1)+ log 2(2*2)+ ... + log 2(n*n)

值得注意的是log 2(n ^ 2)= 2*log 2(n).因此,我们将总和重新计算为:

2*(0 + log 2(1)+ log 2(2)+ ... + log 2(n))

分析这笔钱不是很容易,但看一下这篇文章.使用Sterling的近似可以归属于它O(n*log(n)).因此整体复杂性是O((n/4)*2*n*log(n))= O(n^2*log(n))

  • 不需要斯特林:log2(1)+ log2(2)+ ... + log2(n)<= log2(n)+ log2(n)+ ... + log2(n)= n*log2(n) .这并不能证明界限是紧的,但是为了获得O( - )就足够了. (4认同)

ami*_*mit 7

  • 就内容而言j,内循环是O(log_2(j^2))时间,但log_2(j^2)=2log(j)实际上是正弦 O(log(j)).
  • 对于中间循环的每次迭代,它需要O(log(j))时间(做内循环),所以我们需要求和:

    sum {log(j)| j = 1,...,n-1} log(1)+ log(2)+ ... + log(n-1)= log((n-1)!)

自从log((n-1)!)进入以来O((n-1)log(n-1)) = O(nlogn),我们可以得出中间循环的结果O(nlogn).

  • 注意,中间和内部循环都是独立的i,因此为了得到总复杂度,我们可以将n/4(外部循环的重复次数)与中间循环的复杂性相乘,得到:

    O(n/4*nlogn)= O(n ^ 2logn)

所以,这段代码的总复杂性是 O(n^2 * log(n))