Algorithm 嵌套循环的程序复杂性

Algorithm 嵌套循环的程序复杂性,algorithm,Algorithm,我发现了以下算法: for i in range(1, n) for j in range(i+1,n+1) for k in range(1,j+1) //some instructions 我想确定它的复杂性,到目前为止,我所做的工作如下: 我已经将三个循环转换为求和,所以 因此,当我分析循环j和k时,很容易看出,当j从2开始时,k会生成2个循环,当j从3开始时,k会生成3个循环,依此类推。在这一点上,我可以做如下事情: 我认

我发现了以下算法:

for i in range(1, n)
    for j in range(i+1,n+1)
           for k in range(1,j+1)
               //some instructions
我想确定它的复杂性,到目前为止,我所做的工作如下:

我已经将三个循环转换为求和,所以

因此,当我分析循环j和k时,很容易看出,当j从2开始时,k会生成2个循环,当j从3开始时,k会生成3个循环,依此类推。在这一点上,我可以做如下事情:

我认为c是k循环中的指令。对于完成,我可以说我有:

这个分析是正确的还是我遗漏了什么

谢谢

正如您所相信的,这里有O(n^3)个步骤。你的启发已经表明O(n^3)是一个上界——但有人可能会问它是否是一个紧上界。事实上,它是(假设每个循环的内容本质上是一个常数时间操作)

了解这一点的一种方法是制定一些宽松的上限和下限

对于上界,请注意i的范围为1到n,j的范围为1到n+1的子集,k的范围为1到n+2的子集。然后,与i、j和k分别经过(1,n)、(1,n+1)和(1,n+2)时相比,步骤更少。这是O(n^3)步。因此,最多有O(n^3)个步骤。我注意到这大概是你用来给出答案的启发式方法


对于下限,我们可以注意到,当i在(n/3,2n/3)中时,j指数将始终包括范围(2n/3+1,n+1)。对于这些范围内的i和j,k指数总是包括范围(1,2n/3+2)。这些范围的长度是n/3(对于i)、n/3(对于j)和2n/3+1(对于k)。这也是n^3阶,所以O(n^3)是正确的估计。有些人会说这是BigTheta(n^3)。

结果是好的,是O(n^3)。你得到的数字是正确的。