algorithm - 时间复杂度单循环与多顺序循环

标签 algorithm performance loops time-complexity complexity-theory

今天,我和我的同事就一个特定的代码片段发生了小争执。代码看起来像这样。至少,他是这么想的。

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
}

他要我删除第二个循环,因为它会导致性能问题。

但是,我确信由于我这里没有任何嵌套循环,所以无论我放置了多少顺序循环(我们只有 2 个),复杂度始终为 O(n) ).

他的论点是,如果 n 是 1,000,000 并且循环需要 5 秒,我的代码将需要 10 秒,因为它有 2 个 for 循环。听到这句话后我很困惑。

我从我的 DSA 类(class)中记得的是,我们在计算 Big Oh 时忽略了这些常量。

我在这里错过了什么?

最佳答案

是的,
复杂性理论可能有助于比较 [?TIME][?SPACE] 中两种不同的计算方法,
但是

不要使用[PTIME]复杂性作为低效率的论据


事实#1: O( f(N) )N ~ INFTY 附近区域的复杂性比较相关,因此可以“在那里”比较流程主体限制

事实 #2:给定 N ~ { 10k | 10M | 10G ,不满足上述条件

事实#3:如果流程(算法)允许循环合并而没有任何副作用(对资源/阻塞/等)到一个 channel 中,单循环处理可能始终受益于减少的循环开销。


一个微基准将决定,而不是O( f( N ) ) for N ~ INFTY

随着许多附加效果的影响越来越大——更好或更差的缓存行对齐以及可能的 L1/L2/L3 缓存重用量,更多/更少 CPU 寄存器的智能利用——所有这些都是由可能的编译器优化,并可能进一步提高小型 N-s 的代码执行速度,超出上面的任何预期。

所以,
在诉诸争论 O( f( N ) )

的限制之前,请执行几个与缩放相关的微基准测试

总是这样。

关于algorithm - 时间复杂度单循环与多顺序循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46171238/

相关文章:

c++ - 用于添加和查找查询的适当数据结构

performance - Erlang 二进制文件以降低大小写性能

python - 排序多个列表的最快方法 - Python

c# - 并行和异步方法

algorithm - 二维坐标归一化

algorithm - 从前序和后序遍历构建树

mysql - SQL 函数从 5.5 开始非常慢

java - int 数组的循环优化

javascript - Jquery循环通过onmouseover,有多个div

php - 使用 WordPress Pods CMS 管理多层次关系的最有效方法是什么