这段代码的哪个陈述是正确的?

What statement is true for this piece of code?

我正在为我的考试做准备,我正在为此做一些练习 - 我遇到了一个问题,我有点不确定。

问题:

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

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

我不确定的是,你什么时候称呼某些东西 "array access" 什么时候是比较?这就是为什么我不确定答案是 B 还是 A。

在我看来你是对的。

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

所以只计算最好和最坏的情况。

  • 最坏的情况是什么?最坏的情况是数组元素的 none 为零。
  • 最好的情况是什么?如果第一个元素为零(我们不认为 N​​ 为零,因为我们想查看 N 增加时行为的总体情况)。

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

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

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

答案不可能是C,因为在"best case"中我们发现数组的第一个元素是0,而循环returns只做了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 次。