嵌套while循环的运行时间

时间:2017-10-26 19:05:16

标签: while-loop runtime big-o

Function f(n)
    s = 0
    i = 1
    while i < 7n^1/2 do
        j = i
        while j > 5 do
            s = s + i -j
            j = j -2
        end
        i = 5i
    end
    return s
end f

我正在尝试使用上面的代码解决大theta的运行时间。我一直在寻找一些东西来帮助我举个例子,但一切都是循环或只有一个循环。你会怎么用嵌套的while循环来解决这个问题?

2 个答案:

答案 0 :(得分:0)

第一个循环将进行7 * sqrt(n)次迭代。指数1/2与数字的sqrt()相同。

第二个循环将运行m - 2次,因为i的前两个值分别为1和5,而不是通过比较。

i的增量为5i

n = 16

为例
i = 1, n = 16;
while( i < 7 * 4; i *= 5 )
    //Do something

First value of i = 1. It runs 1 time. Inside loop will run 0 times.
Second value of i = 5. It runs 2 times. Inside loop will run 0 times.
Third value of i = 25. It runs 3 times. Inside loop will run 10 times.
Fourth value of i = 125. It stops.

外迭代是n次迭代,而内部迭代是m次迭代,得到O(7sqrt(n)*(m - 2))

IMO,很复杂。

答案 1 :(得分:0)

让我们将其分解为两个关键点:

  • i从1开始,并自动乘以5,直到它大于或等于7 sqrt(n)。这是以对数步数呈指数增长。因此,我们可以将代码更改为以下等效项:

    m = floor(log(5, 7n^(1/2)))
    k = 0
    while k < m do
       j = 5^k
       // ... inner loop ...
    end
    
  • 对于外循环的每次迭代,ji开始,以2为步长递减,直到它小于或等于5。请注意,在外循环i = 1和第二个i = 5的第一次执行中,内循环在第三次迭代之前不会执行。循环限制意味着如果j为奇数,则k的最终值为7,如果为偶数则为6(您可以使用笔和纸进行检查)。

结合上述步骤,我们得出:

enter image description here