[英]I don't understand how the time complexity for this algorithm is calculated
int j=0;
for (int i=0; i<N; i++)
{
while ( (j<N-1) && (A[i]-A[j] > D) )
j++;
if (A[i]-A[j] == D)
return 1;
}
据说这段代码的时间复杂度为O(n),但我并没有真正得到它。 内循环执行N次,外部也应该N次? 是因为j = 0; 在循环之外使它只运行N次?
但即使它只在内循环中运行N次,if语句检查也应该进行N次,这应该将总时间复杂度带到O(n ^ 2)?
这是O(n)的原因是因为在for
循环的主体中j
没有被设置回0
。
实际上,如果我们看一下for
循环的主体,我们会看到:
while ( (j<N-1) && (A[i]-A[j] > D) )
j++;
这意味着j++
最多完成n-1次,因为如果j
成功N-1
次,则第一个约束失败。
如果我们看一下整个for
循环,我们会看到:
int j=0;
for (int i=0; i<N; i++) {
while ( (j<N-1) && (A[i]-A[j] > D) )
j++;
if (A[i]-A[j] == D)
return 1;
}
很明显, for
循环的主体重复n次,因为我们将i
设置为i=0
,并且当i >= N
时停止,并且每次迭代我们增加i
。
现在,根据A
的值,我们将在或不会在for
循环体中增加j
(多次)。 但无论在一次迭代中完成多少次,在for
循环结束时, j++
最多都会完成n次,这是我们上面提到的原因。
while循环中的条件也执行O(n) (最多精确2×n-1次)次数:每次进入for
循环体时执行一次,每次执行后我们执行一次执行一个j++
命令,但因为两者都是O(n) ,所以这最多是O(n + n),因此是O(n)次。
所述if
条件在for
循环执行n次:一次每次迭代的for
循环,所以再次为O(n)。
所以这确实意味着所有“基本指令”( j++
, i = 0
, j = 0
, j < N-1
等)都是以常数O(1)或线性次数完成的O(n) ,因此算法是O(n) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.