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