对于代码中的多个参数,与O2N相比,OM + N的混淆更正确

问题描述

我听说此代码中正确或最严格的上限是O(N + M)。我的问题是为什么说O(N + N)是错误的。我听说这将是一个松散或错误的上限。如果是这样,我们如何知道O(n) O(m)?我一直看到的主要原因是我们在O(2N)上使用O(N + M)是因为无法保证O(N)= O(M)。我的困惑是我们怎么不能说O(N)= O(M)是真的?显然,我们有两个简单的for循环,它们线性运行,这使我们可以将它们添加到我的脑海中并使其变为O(N + N)。我要去哪里错了?是因为我们不知道两个线性增长率是否有任何关系?如果在常规数学中是这种情况,我们可以知道两个线性增长率都不同,则可以将2x与3x相加,使其成为2x + 5x。

public void ex(int n,int m)
{
int i - 0;
int j = 0; 
while(i < n)
{ 
    i++: 
}
while(j < m)
{
    j++; 
}
}

解决方法

由于我们不知道N是否等于M,并且存在两个循环,因此O(N + M)。
我们不能说O(N + N)或O(M + M),因为N和M可能相差很大。

让我们说while循环的一次迭代需要1秒。 考虑N = 5&M = 10000。

所以,5秒+10000秒= 10005秒。

现在,如果您考虑过O(N + N),则只需10秒钟。

如果您考虑过O(M + M),则大约需要20000秒。

两者差异很大。

因此O(N + M)更好,更准确。

当然,如果N几乎等于M,那么我们可以说O(N + N)再次等于O(N),因为我们删除了常量(在这种情况下为2)。

但是,总的来说,它具有线性时间复杂度。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...