分析给定的程序

时间:2016-02-02 02:24:03

标签: algorithm math analysis

我获得了一段代码并告诉他们进行分析。我感到很困惑。我需要计算foo运行多少次并使用它来确定n的函数。我知道foo运行了多少次,但我无法确定正确的功能。这是代码:

j = 1;
while( j <= n/2 )
{
   i = 1;
   while( i <= j )
   {
      foo;
      i++;
   }
   j++;
}

我知道foo以一种模式运行,其中n的一半被添加到运行中。例如,当n = 2foo运行1时,n = 4时,foo运行3次,n = 6时,foo运行6次,等等。

n = 2   runs -> j = 1 *          1 run


n = 4   runs -> j = 1 * 
                j = 2 * *        3 runs

n = 6   runs -> j = 1 * 
                j = 2 * *
                j = 3 * * *      6 runs

n = 8   runs -> j = 1 *
                j = 2 * *
                j = 3 * * *
                j = 4 * * * *    10 runs

也许我只是在考虑这个问题,但我一直在盯着我的笔记本几个小时试图按照这种行为只提出n的某些功能。有人可以帮忙吗?

编辑我有另一个问题。我怎么知道这个函数是在Big-O还是Big-Theta?是否与使用while循环而不是for循环有关?

2 个答案:

答案 0 :(得分:1)

一旦我们意识到大部分工作是由内部while循环完成的,我们可以计算运行时(对于给定的n)作为内部while循环运行的次数:

1+2+3+...n/2 

summation formula

= O(n 2 )。

答案 1 :(得分:1)

j 运行 n / 2 次。对于每次这样的迭代, i 运行 j 次。对于 i 的每次此类迭代,都会调用foo。所以通话次数是

Σ j = 1 n / 2 [j] =(1 + n / 2)n / 4 =Θ(n 2 < / SUP>)

从1到 n / 2 只是arithmetic series