我有一个算法如下:
甚至我有找到这个算法下限的anwser:
但问题是我无法理解这一点:当我们设置i> = n / 2但是n / 4< = j< = n / 2时,在这个算法中j不能得到任何值,但是你在答案中看到中间循环迭代n / 4?
我真的很困惑。
答案 0 :(得分:2)
好的,我不确定你对哪一部分感到困惑,但让我从你的摘要中重新解释下限解释,也许,混淆部分会清理。
首先,下限方法(有点明显的东西,但在你的摘要中省略,对初学者来说可能是不明显的)。如果您想象(i,j,k)的所有可能值的集合,我们不希望将它们全部计算,但我们只计算它们的较小子集,由某些任意定义限制。事实证明,计算子集的下限比整个集合更容易(因为你可以做简单的数学运算,比如因为这些限制而乘以范围的下限),而且传统上,这也是整个集合的下限。 。
现在,这些任意限制选择以下内容: 1)只查看i值> = n / 2。这意味着,不是看[1..n],而是看[n / 2..n]。 2)考虑到先前的限制,也限制j:查看范围[n / 4..n / 2]中的j值。文中的“考虑”一词适用于(1)和(2))。请注意,我们可以这样做的原因是[n / 4..n / 2]始终是[1..i]范围的子集,因为我们已经决定只查看i> = n /的情况2。因此,将[1..i]限制为[n / 4..n / 2]是正确的做法,以获得一些下限。
现在我们知道i是[n / 2..n](至少n / 2),j是[n / 4..n / 2](至少n / 4),有n /可能(i,j)对的2 * n / 4种组合。对于这些对中的每一对,内循环将至少进行n / 4-1次迭代(我不知道为什么-1,也许表示向下舍入?),因此我们得到n / 2 * n / 4 *(n / 4-1)(i,j,k)的元组是欧米茄(n ^ 3)。
如果一小部分变体是omega(n ^ 3),那么原始集合也是omega(n ^ 3)。
P.S。我不明白为什么你说“n / 4< = j< = n / 2然后在这个算法j中不能得到任何值”。 n / 4小于n / 2,因此对于足够大的n值,j范围将有一些数字。
答案 1 :(得分:1)
在我看来,中间循环中的迭代次数应始终小于或等于内循环中的迭代次数,因为k总是从1到j。
以下是我走过循环的例子。
array[1,2,3,4,5]
will produce the following iterations with the restrictions on the loops:
i=3,j=2,k=1 //i starts at 3 because of n/2 minimum
//j can't go below or above 2 because of condition on middle loop
i=3,j=2,k=2
i=4,j=2,k=1
i=4,j=2,k=2
i=5,j=2,k=1
i=5,j=2,k=2
3 iterations of outer loop (at least n/2)
1 iteration of middle loop for each outer loop iteration (NOT at least n/4)
2 iterations of inner loop for each iteration of middle loop (at least n/4 - 1)
文本可能刚刚交换了底部两个循环的描述。如果是这种情况,给出的答案仍然是正确的。
无论如何,重要的是要注意它在O(n ^ 3)时间运行。
答案 2 :(得分:0)
您可以将循环中的迭代次数可视化为
for( i in [1..n] )
for( j in [1..i] )
statement;
as(对于n = 6):
x
x x
x x x
x x x x
x x x x x
x x x x x x
这会给你复杂性O(N*N)
。
最内层循环(在您的样本中)中的迭代次数也是N依赖的,因此它将为您提供一个N乘数(第三维)。所以x
es将填充1/32(?)的立方体积。但由于它是立方体形成,因此复杂性将为O(N³)