for(i=1; i < n; i++){
for(j=1; j <= i; j++){
statement1;
}
}
似乎n ^ 3是这些嵌套循环的复杂性。但根据书籍,它的复杂程度是N(N-1)/ 2的n ^ 2。
答案 0 :(得分:2)
为了简化问题,我们假设n在这里是5。 因此,第1行将执行5次,因为它将检查并递增i值5次。 第2行将执行(5-1)= 4次,因为对于i = 5,它将不会执行,但第1行将执行i = 5。 第3行将执行1次,2次3次,依此类推,每次i递增。
将第3行的复杂性纳入上下文,你会发现它正在执行1 + 2 + 3 + 4 = 10次。它只是从1到4的数字之和,或者你可以说,n(n + 1)/ 2,其中n = 4。 我们可以忽略第1行和第2行的复杂性,因为它们是常数并且是渐近符号,复杂度将是O(n ^ 2)。
答案 1 :(得分:1)
唯一有趣的事情是statement1
执行的频率。
因此,请注意类似
的内容for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
statement1;
触发2 * 3 = 6
次执行。因此,您可以计算内循环执行的频率每个外循环迭代。
但是,在您的示例中,您犯了一个错误并将外循环的迭代乘以内循环的总迭代,而不是每个外循环迭代的迭代次数 强>
在上面的示例中,2 * 6 = 12
代替2 * 3 = 6
。
让我们仔细看看您的具体示例中会发生什么。外循环触发内循环的n
次迭代。内循环首先产生1
次迭代。在外循环的下一次迭代中,它将产生2
次迭代,然后是3
,依此类推。
因此,您将收到内循环的1 + 2 + ... + n = (n^2 - n)/2
次迭代。再次注意'总计'。因此statement1
将总计执行(n^2 - n)/2
次。外循环迭代已经被考虑用于计算内循环总运行,没有额外的乘法。
(n^2 - n)/2
显然位于O(n^2)
,因为它的渐近复杂性。直觉上只有最重要的因素起作用,我们可以通过<=
进行估算来放弃其他内容。
(n^2 - n)/2
<= n^2 - n
<= n^2 in O(n^2)