今天,我和我的同事就一个特定的代码片段发生了一场小争论。代码看起来像这样。至少,他想象中是这样的。
for(int i = 0; i < n; i++) {
// Some operations here
}
for (int i = 0; i < m; i++) { // m is always small
// Some more operations here
}
他希望我删除第二个循环,因为它会导致性能问题。
但是,我确信由于这里没有任何嵌套循环,因此复杂性始终是O(n),无论我放置了多少个顺序循环(我们只有 2 个)。
他的论点是,如果n
是 1,000,000 并且循环需要 5 秒,我的代码将需要 10 秒,因为它有 2 个 for 循环。听到这句话后我很困惑。
我从 DSA 课程中记得的是,我们在计算 Big Oh 时忽略了这些常数。
我在这里缺少什么?
Yes,
复杂性理论可能有助于比较两种不同的计算方法[?TIME][?SPACE]
,
but
不使用[PTIME]
复杂性是效率低下的理由
Fact #1: O( f(N) )
与比较复杂性相关,在附近的区域N ~ INFTY
,因此可以在“那里”比较过程主要限制
Fact #2: Given N ~ { 10k | 10M | 10G }
,这些情况都不符合上述条件
Fact #3:如果过程(算法)允许循环合并而没有任何副作用(对资源/阻塞等)到单次传递中,则单循环处理可能总是受益于循环开销的减少。
微观基准将决定,而不是O( f( N ) )
for N ~ INFTY
由于许多附加效果会产生更强的影响 - 更好或更差的缓存行对齐以及可能的 L1/L2/L3 缓存重用量、智能利用更多/更少的 CPU 寄存器 - 所有这些都由可能的编译器驱动 -优化,并可能进一步提高小型代码的执行速度N
-s,超出上面的任何预期。
So,
在争论限制之前,确实要执行一些与缩放相关的微基准测试O( f( N ) )
总是做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)