我正准备参加我的考试,我正在做一些考试 - 我提出了一个问题,我有点不确定。
问题:
我确信答案不能是C或D,因为代码的最佳运行时间是O(1),最坏情况下的运行时间是O(n)。
我还认为B必须是正确的答案,因为如果A [i] == 0,forloop中的if语句会比较。最坏的情况是N.
我不确定的是,你何时称之为“数组访问”,何时进行比较?这就是为什么我不确定,如果答案是B或A.
答案 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] = x
,print(arr[i])
或自定义访问者等因此,只需计算最佳和最差情况。
在这些情况下它会有多少次迭代?有多少阵列访问和比较?不要忘记for循环中的比较操作。
算法在最佳和最差情况下是线性的还是二次的?