Algorithm 循环的增长顺序
下面代码的增长顺序是什么。我的猜测是,每个循环的增长都是线性的,但是if语句让我感到困惑。我怎么把它和整件事联系起来呢。我非常希望得到一个解释性的答案,这样我就可以理解所涉及的过程Algorithm 循环的增长顺序,algorithm,time-complexity,Algorithm,Time Complexity,下面代码的增长顺序是什么。我的猜测是,每个循环的增长都是线性的,但是if语句让我感到困惑。我怎么把它和整件事联系起来呢。我非常希望得到一个解释性的答案,这样我就可以理解所涉及的过程 int count = 0; for (int i = 0; i < N; i++) for (int j = i+1; j < N; j++) for (int k = j+1; k < N; k++) if(a[i] + a[j] + a[k] == 0) count++; int count
int count = 0;
for (int i = 0; i < N; i++)
for (int j = i+1; j < N; j++)
for (int k = j+1; k < N; k++)
if(a[i] + a[j] + a[k] == 0)
count++;
int count=0;
对于(int i=0;i
代码的增长顺序为O(N^3)
一般来说,长度为N的k个嵌套循环有助于O(N^k)的增长。当试图确定代码的复杂性时,有两件事情可能会让人困惑
i+1
开始,第三个循环从j+1
开始。这会影响复杂性吗?事实并非如此。让我们只考虑前两个循环。对于i=0
,第二个运行N-1
次,对于i=1
它运行N-2
次,…,对于i=N-1
它运行0
次。把这些加起来:
0 + 1 + ... + N - 1 = N(N - 1) / 2 = O(N^2).
因此,不从0开始不会影响复杂性(请记住,大oh忽略低阶项和常量)。因此,即使在这个设置下,整个过程也是O(N^3)
if
语句。if
语句在这里显然不相关,因为它只是最后一个循环的一部分,不包含break
语句或其他会影响循环的代码。它只影响计数的递增,而不影响任何循环的执行,因此我们可以安全地忽略它。即使计数没有增加(一个O(1)
操作),检查if
条件(也是一个O(1)
操作),因此使用和不使用if
执行相同的大致操作数
因此,即使使用if
语句,算法仍然是O(N^3)
这里有两个是在没有太多计算的情况下发现时间复杂度是θ(N^3)
首先,您选择
i嵌套循环收缩每个迭代是否会影响结果?我期待的是阶乘或其他修饰符不是真的。虽然它会影响N^k旁边的常数,但它并不会真正影响O的表示法。也许我当时出错了,对此我还是很陌生:O(N*(N-1)*(N-2))=O(N^3-3*N^2+2n)你完全正确!注意O(n^3-3*n^2+2n)=O(n^3),因为最大的“因子”总是超过。我能问一下为什么你把n(n-1)除以2吗。@JVTura-因为求和是通过将第一项与最后一项、第二项与倒数第二项进行分组来计算的。例如,对于0+1+2+3+4
,我们将(0+4)+(1+3)+(2+2)+(3+1)+(4+0)
。有N=5
组,每个组的和N-1=4
。但是我们必须除以2,因为每个组发生两次,所以如果我们不除以,我们就会求和过多:5*4/2=10
,这是正确的。这个代码片段的增长顺序是什么?int sum=0;for(int N=N;N>0;N/=2;)for(int i=0;i
(代码行的(缺少)注释和缩进让人怀疑这应该做什么。)请明确说明[猜测]每个循环的增长都是线性的
。你的问题是什么?你有一条语句,它的成本可以被视为常数,作为它的控制。这是在一个三重嵌套的循环中:如果所有循环都从0运行到N呢?如果是上面的初始值呢?