这段代码的含义是什么?

时间:2016-05-24 16:52:02

标签: algorithm time big-o

我正准备参加我的考试,我正在做一些考试 - 我提出了一个问题,我有点不确定。

问题:

enter image description here

我确信答案不能是C或D,因为代码的最佳运行时间是O(1),最坏情况下的运行时间是O(n)。

我还认为B必须是正确的答案,因为如果A [i] == 0,forloop中的if语句会比较。最坏的情况是N.

我不确定的是,你何时称之为“数组访问”,何时进行比较?这就是为什么我不确定,如果答案是B或A.

2 个答案:

答案 0 :(得分:5)

答案是B - 在最坏的情况下,此代码总共进行了2N次比较。假设循环是空的。需要进行N次比较(i < n)才能运行空循环。现在考虑循环中的if语句 - 这是在最坏情况下总共2N比较的另一个N比较。

答案不能是C,因为在&#34;最好的情况下&#34;我们发现数组的第一个元素是0,并且在仅进行2次比较后循环返回,使得最佳情况O(1)不变。

答案显然不是D;这个循环没有任何二次方。它显然是线性的。

答案不能是A,因为在最坏的情况下我们只访问数组N次。这发生在s[i],就在与0的比较之前。

考虑以下等效代码:

int n = s.length();
for (int i=0; i < n; i++)
{
    int v = s[i];
    if (v == 0)
        return i;
}

现在它应该更加明显,什么算作比较,什么算作数组访问。在最坏的情况下,我们将访问数组N次。

答案 1 :(得分:3)

对我而言,看起来你是对的。

  • 比较:使用运算符==!=><>=<=,自定义比较运算符或比较方法。
  • 数组访问:任何arr[i],例如arr[i] = xprint(arr[i])或自定义访问者等

因此,只需计算最佳和最差情况。

  • 最坏的情况是什么?最糟糕的情况是没有数组元素为零。
  • 最好的情况是什么?如果第一个元素为零(我们不计算N为零,因为我们希望在N增加时查看行为的总体)。

在这些情况下它会有多少次迭代?有多少阵列访问和比较?不要忘记for循环中的比较操作。

算法在最佳和最差情况下是线性的还是二次的?