algorithm - 为什么在分析算法效率时不考虑常量?

标签 algorithm time-complexity

在分析算法时间效率时不考虑乘法常数,因为
A) 它们在计算效率函数时相互抵消
B) 常数函数随着输入大小的增长而增长非常缓慢
C) 它们当输入量较小时影响很小
D)它们可以被更快的机器克服
E)它们不影响算法的实际运行时间

我猜是“B”,但我不知道正确答案。所有选项都不正确吗?

最佳答案

所以这是我的评论扩展到一个答案:

B) constant functions grow very slowly with input size growth

这甚至没有意义。常数函数甚至根本不会增长; 但是,这里我们不是在谈论恒定的运行时函数,而是在估计“步数”的实际数量时可能出现的常数系数 "给定算法的渐近复杂性。

然而,在渐近分析中,我们不关心确切的步数,只关心运行时间的比率作为输入大小的函数的限制,因为输入大小趋于无穷大。

E. G。 O(n ^ 2) 表示如果将输入大小加倍,运行时间将约为原来的 4 倍,如果将输入大小增加三倍,则将是原来的 9 倍,依此类推。它没有说执行将采取恰好“4 步”或“9 步”。

C) they have a small effect when input size is small

不,当输入尺寸较小时,它们的效果相当显着。同样,我们正在考虑输入大小接近无穷大的限制。与 n 的任何非常量单调增长函数相比,随着 n 趋于无穷大,任何常数都可以渐近忽略。

n 较小时,常量会对执行时间产生巨大影响。例如,有各种有趣和聪明的数据结构,但如果我们只有少量数据,我们通常更喜欢数组而不是 e。 G。二叉树或链表,即使是频繁插入,因为数组良好的缓存局部性属性使其常数因子非常小,理论上 O(n) 插入可能比O(log n) 插入到树中。

D) they can be overcome by faster machines

这个答案完全没有捕获重点,算法的渐近分析与物理机器的速度无关。是的,机器随着时间的推移变得越来越快,但同样,这只是一个不变的因素。如果您在速度更快的机器上运行用于 O(n ^ 2) 算法的程序,在输入大小加倍的情况下执行它仍需要 4 倍的 CPU 时间。

E) they do not affect the actual run time of the algorithm

那也是错误的,他们绝对是这样。

所以剩下的唯一答案是 A,如果按照我上面的解释(与执行时间的比率相关)进行解释,它可能是正确的,但我肯定会用完全不同的措辞。

关于algorithm - 为什么在分析算法效率时不考虑常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096401/

相关文章:

javascript - 如何优化编辑距离来检查距离为 1?

c++ - 比较 unordered_map 与 unordered_set

algorithm - 二叉树的数学证明

algorithm - 智能视频缩略图生成算法

c++ - 二十一点算法

java - 两个列表的交点JAVA

java - 将所有子目录中所有文件中的所有数字相加 - 复杂性?

c++ - 为什么 std::map::operator[] 的复杂度相对于键数是对数的?

javascript - Lodash 函数的计算复杂度

java - Java 的 substring() 的时间复杂度