有一个代码
var a = 0;
for(var i = 0; i < n; i++)
{
a++;
a++;
a++;
}
并且有一个代码
var a = 0;
for(var i = 0; i < n; i++)
{
a += 3;
}
两种算法的复杂度都是 O(n),但是该死的……
很明显,任何适当的编译器都会将第一个选项折叠成第二个选项,但有些情况并不那么明显,所以让我们假设编译器不会这样做。
结果,第二个代码的执行速度比第一个快 3 倍。但是难度是一样的。在这种情况下,如何“科学地”证明第一个代码是便便?
你说的是“O 表达式中的常数”问题。
在最简单的情况下,您只是在理论上估计执行时间(计算次数)结果会更高。在更复杂的情况下(是的,即使在如此简单的情况下!)需要正常的时间安排,因为很可能由于体系结构或编译器的某些特殊性,正如您所说,对您来说最好的代码是“粪”。
在您的问题上下文中,代码的复杂性不在于代码与其他代码相比运行的速度有多快,而在于执行时间在扩展任务时如何变化 - 仅此而已。
例如,有一段代码处理
n大小为 的矩阵的所有元素n。该数字n是任务大小的度量。该代码可以将所有元素递增 1(更快)或计算它们的指数(更慢),但其复杂度为O(n^2). 更改n后,执行时间将与更改的平方成正比n。