【发布时间】:2019-04-02 20:00:38
【问题描述】:
无论乘法(或除法)操作如何实现(即是软件功能还是硬件指令),都无法及时解决O(1)。对于较大的n 值,处理器甚至无法通过一条指令计算它。
在这样的算法中,为什么这些操作是常量而不依赖于n?
for (i = 1; i <= n; i++) {
j = n;
while (j > 1)
j = j / 3; //constant operation
}
【问题讨论】:
-
这取决于底层架构如何实现。在大多数实践情况下,它是无关紧要的,可以由一个足够大的常数限定。事实上,常数可能是最大可能值,在这种情况下,操作立即有界。无论如何,它通常与所分析的算法无关,只会偏向于我们真正感兴趣的内容。
-
通常,本地类型的乘法是 O(1)(恒定时间)。 Java、.NET 和其他环境中的大整数类型通常具有更高的复杂性。例如,请参阅javaspecialists.eu/archive/Issue236.html。
-
@JimMischel 我们正在计算大 n 值的复杂度。所以我们应该让 n 尽可能大。那么为什么乘以 n 是常数呢? (据我所知,通常假定它是恒定的)
-
只是把它当作假设(有时被采用)显示理论和实践之间的差距。从理论的角度来看,您还可以质疑加法的恒定复杂性,考虑到物理学:光速和每面积/体积信息密度的上限(在所有东西都消失在黑洞中之前)。
-
请重新阅读我的评论。如果您的
n是本机类型(如long或double),则该值无关紧要。系统乘以 9324568078 的速度与乘以 7 的速度一样快。如果n是其他一些非本地类型(如BigInteger),则乘法具有更高的复杂性,如我链接的文章中所述。跨度>
标签: algorithm time-complexity computability