Algorithm 分析给定的程序

Algorithm 分析给定的程序,algorithm,math,analysis,Algorithm,Math,Analysis,给我一段代码,让我分析它。我很困惑。我需要计算出foo运行了多少次,并使用它来确定n的函数。我知道foo运行了多少次,但我无法确定正确的函数。代码如下: j = 1; while( j <= n/2 ) { i = 1; while( i <= j ) { foo; i++; } j++; } 也许我只是想得太多了,但我已经盯着我的笔记本看了好几个小时,试图想出一些函数,这些函数只有n遵循这种行为。有人能帮忙吗 编辑我还有一个问

给我一段代码,让我分析它。我很困惑。我需要计算出
foo
运行了多少次,并使用它来确定
n
的函数。我知道
foo
运行了多少次,但我无法确定正确的函数。代码如下:

j = 1;
while( j <= n/2 )
{
   i = 1;
   while( i <= j )
   {
      foo;
      i++;
   }
   j++;
}
也许我只是想得太多了,但我已经盯着我的笔记本看了好几个小时,试图想出一些函数,这些函数只有
n
遵循这种行为。有人能帮忙吗


编辑我还有一个问题。我怎么知道这个函数是大O还是大θ?这与使用
while
循环而不是
for
循环有关吗?

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

1+2+3+...n/2 
哪个是

=O(n2)。

j运行n/2次。对于每个这样的迭代,我运行j次。对于i的每个这样的迭代,
foo
被调用。所以电话的数量是

∑j=1n/2[j]=(1+n/2)n/4=Θ(n2)


这只是一个从1到n/2的过程。

OP要求的是实际的运行次数,而不是大O顺序。谢谢,@DStanley-我怀疑最终目的不是增长顺序,而是更新了总和。我得到了
j
运行
n/2
次以及每次这样的迭代
I
运行
j
次。我只是不知道如何从中得到
[(1+n/2)*n]/2
。我确实看到,因为我们有一个
n
乘以另一个
n
,所以大的θ订单将是$n^2$。你怎么知道把
n/2
加到
1
上,然后乘以
n
,再除以
2
?我花了好几个小时才把东西划掉。我想函数中可能有错误。例如,当
n=4
时,答案应该是
3次运行
。但是当我将
4
插入等式时,我一直得到
6
。我认为函数应该是
(1+n/2)n/4
OP要求的是实际的运行次数,而不是大O顺序。这包括循环执行的次数。这是第n/2个三角形数。闭式(n/2)((n/2)-1)/2,即1+2+3+…+n/2之和。当然,这是渐近二次的(由n^2控制)。如果我们在这里是超技术的,实际上是:floor(n/2)(floor(n/2)-1)/2,因为整数除法的截断。但一般来说,考虑这些无关紧要的因素是不好的,因此大多数人会用O(n^2)来回答这个问题。重复“while循环而不是for循环”?我想你需要一本关于复杂性的入门书。复杂性只取决于程序执行的操作数量,而不取决于用于完成相同操作的实际迭代构造。请注意,无论您使用for循环还是while循环,操作的数量都是相同的。我正在查看的一些使用
while
循环的示例涉及Big-O,因为如果满足某些条件,它们可以提前结束。例如,
For(inti=0;i
1+2+3+...n/2