【问题标题】:Why is it assumpted that the time-complexity of multiplication by n is constant?为什么假设乘以 n 的时间复杂度是常数?
【发布时间】: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 是本机类型(如longdouble),则该值无关紧要。系统乘以 9324568078 的速度与乘以 7 的速度一样快。如果 n 是其他一些非本地类型(如 BigInteger),则乘法具有更高的复杂性,如我链接的文章中所述。跨度>

标签: algorithm time-complexity computability


【解决方案1】:

时间复杂度不是时间的度量。它是对“基本操作”的衡量标准,可以根据需要进行定义。通常,任何算术运算都被认为是基本运算。有时(例如,在考虑排序算法或哈希表操作的时间复杂度时),基本操作是比较。有时,“基本操作”是对单个位的操作(在这种情况下,j=j/3 的时间复杂度为 O(log(j))。

倾向于遵循的规则是:

  • 如果您说的是排序或哈希表,那么基本操作就是比较
  • 如果您谈论的是任何其他实用算法,基本运算是算术运算和赋值。
  • 如果您谈论的是 P/NP 类,则基本操作是确定性图灵机的步数。 (我认为这相当于位操作)。
  • 如果您作为复杂性理论专家谈论实用算法,您通常会假设基本类型有 ~log n 位,并且基本运算是算术运算和对这些 ~log n 位字的赋值。李>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 2023-02-10
    • 2016-10-27
    • 1970-01-01
    • 2012-11-10
    • 2020-12-16
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多