这段代码的哪个陈述是正确的?
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] = x
、print(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 次。
我正在为我的考试做准备,我正在为此做一些练习 - 我遇到了一个问题,我有点不确定。
问题:
我确定答案不能是 C 或 D,因为代码的最佳 运行 时间是 O(1),最坏情况 运行 时间是 O( n).
我还认为 B 一定是正确的答案,因为 forloop 中的 if 语句会比较 A[i] == 0。最坏的情况是 N。
我不确定的是,你什么时候称呼某些东西 "array access" 什么时候是比较?这就是为什么我不确定答案是 B 还是 A。
在我看来你是对的。
- 比较:任意使用运算符
==
、!=
、>
、<
、>=
、<=
,自定义比较运算符或比较方法。 - 数组访问:任意
arr[i]
,例如arr[i] = x
、print(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 次。