大O和精确的运行时

时间:2018-06-28 12:09:07

标签: algorithm time-complexity big-o

我正在学习有关Big-O的知识,尽管我开始了解事物,但仍然无法正确地衡量算法的Big-O。 我有一个代码:

int n = 10;
int count = 0;
int k = 0;
for (int i = 1; i < n; i++)
{
  for (int p = 200; p > 2*i; p--)
  {
    int j = i;
    while (j < n)
     {
      do
        {
         count++;
         k = count * j;
        } while (k > j);
        j++;
     }
  }
}

我必须测量Big-O和Exact Runtime。

让我开始吧,第一个for循环是O(n),因为它取决于n变量。 第二个for循环是嵌套的,因此使big-O成为O(n^2)

那么我们如何计算while (j < n)(到目前为止只有3个循环)以及如何计算do while(k > j)(如果出现)会产生4个循环,例如在这种情况下? 理解的解释将非常有帮助。 谢谢。

2 个答案:

答案 0 :(得分:4)

除非我犯了很多错误,否则该程序具有无限循环,因此无法分析其时间复杂性。 特别是

do
    {
         count++;
         k = count * j;
    } while (k > j);

第二次进入此循环后,count = 2k将被设置为更大的j,并且将无限期保持(忽略整数溢出,这种情况会发生很快)。

我了解您正在学习Big-Oh符号,但是创建这样的玩具示例可能不是理解Big-Oh的最佳方法。我建议阅读一本著名的算法教科书,他们将带您了解新算法,并在此过程中解释和分析时间和空间的复杂性。

答案 1 :(得分:0)

我假设while循环应该是:

while (k < j)

现在,在这种情况下,第一个for循环将花费O(n)时间。第二个循环将花费O(p)时间。 现在,对于第三个循环,

int j = i;`
while (j < n){
...
j++;
}

可以改写为

for(j=i;j<n;j++)

表示将花费O(n)时间。 对于最后一个循环,k的值呈指数增加。 认为与

相同
for(k = count*j ;k<j ;j++,count++)

因此,这将需要O(logn)时间。

总时间复杂度为O(n ^ 2 * p * logn)。