对于家庭作业,我获得了以下8个代码片段来分析并给出运行时间的Big-Oh表示法。如果我走在正确的轨道上,有人可以告诉我吗?

//Fragment 1
for(int i = 0; i < n; i++)
    sum++;

我在想片段1的O(N)

//Fragment 2
for(int i = 0; i < n; i+=2)
    sum++;
片段2的

O(N)

//Fragment 3
for(int i = 0; i < n; i++)
    for( int j = 0; j < n; j++)
        sum++;
对于片段3,

O(N ^ 2)

//Fragment 4
for(int i = 0; i < n; i+=2)
    sum++;
for(int j = 0; j < n; j++)
    sum++;

O(N)代表片段4

//Fragment 5
for(int i = 0; i < n; i++)
    for( int j = 0; j < n * n; j++)
        sum++;
片段5的O(N ^ 2)但是n * n让我失望了所以我不太确定

//Fragment 6
for(int i = 0; i < n; i++)
    for( int j = 0; j < i; j++)
        sum++;

O(N ^ 2)也是片段6的

//Fragment 7
for(int i = 0; i < n; i++)
    for( int j = 0; j < n * n; j++)
        for(int k = 0; k < j; k++)
            sum++;
片段7的O(N ^ 3)但是n * n再一次让我失望

//Fragment 8
for(int i = 1; i < n; i = i * 2)
    sum++;

O(N)代表片段8

有帮助吗?

解决方案

我认为片段5是O(n ^ 3),类似片段7是O(n ^ 5)*。对于片段8,它看起来也像O(log(n))。

对于n * n个问题,你必须执行循环体n * n次,所以它将是O(n ^ 2),然后你用其他代码的顺序复合它。片段8实际上会使计数器加倍而不是递增,所以问题越大,你需要做的额外工作就越少,所以它是O(log(n))

*编辑:片段7是O(n ^ 5),而不是我之前认为的O(n ^ 4)。这是因为j 和k 都从1到n * n。对不起,我之前没有抓到这个。

其他提示

片段7是O(n ^ 5),而不是当前接受的评论声明的O(n ^ 4)。否则,这是正确的。

对于案例8,尝试写出一些N值的迭代次数,看看模式是什么样的......它不是O(N)

您似乎走在了正确的轨道上。关于N * N,您认为它会产生什么影响?这是N的另一个因素,因此它可能是一个更高的阶数。

只是一个警告,我看到了另一个这样的帖子,而且投票非常失败。小心。 此处是帖子。

你走在正确的轨道上,但这里有一个关于如何在事情中更加清晰的提示。假设你有一些代码:

for(i = 0; i < n; i++) {
   for(j = 0; j < 100; j++){....}
}

是的,请考虑您拥有不同级别的代码。在此示例中,到目前为止您只能看到3个级别:

  1. 从0-n
  2. 开始的外部for循环
  3. 另一个来自0-100
  4. 的for循环
  5. 里面的一些代码,标记为 ...
  6. 在任何时候你都不应该尝试计算一下去。这是大多数初学者出现某种算术错误的地方。为每个级别单独计算它,然后将它们全部相乘。

    祝你好运!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top