繁体   English   中英

我不明白如何计算此算法的时间复杂度

[英]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 = 0j = 0j < N-1等)都是以常数O(1)或线性次数完成的O(n) ,因此算法是O(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM