【问题标题】:Why does this loop take O(2^n) time complexity?为什么这个循环需要 O(2^n) 时间复杂度?
【发布时间】:2018-01-14 04:16:44
【问题描述】:

有一个循环执行蛮力算法来计算 5 * 3 而不使用算术运算符。

如果输入是 x * y,我只需要添加 5 个 3 次,这样它就需要 O(3),即 O(y)。 然而,在一本书中,它说它需要 O(2^n),其中 n 是输入中的位数。我不明白为什么它使用 O(2^n) 来表示它 O(y)。显示时间复杂度的更好方法吗?你能解释一下吗?

我不是要求其他算法来计算这个。

int result = 0
for(int i=0; i<3; i++){
    result += 5
}

【问题讨论】:

  • 运行时间是一个常数 (O(1)),因为这个循环的运行时间不依赖于任何外部参数。这真的是书上所说的吗?你能举出具体的措辞和它指的是什么吗?
  • 您在谈论“输入中的位数”,我高度怀疑您遗漏了一些与书中内容非常相关的信息。
  • 在一本书中,它说“要形成5x3,我们将从0开始并重复添加5。时间复杂度非常高,高达O(2^n),其中n是数字输入中的位数”。但是 3 是 0011。n 是位数是什么意思?为了表示 3,它只需要 2 位。 O(2^2) = O(4)。为什么作者使用 O(2^n),其中 n 是输入中的位数,而不是 O(n)?
  • @DannaDChoe 哦,那我的错。扔书。或者有一些我们不知道的背景。
  • @DannaDChoe 如果循环取决于位数,那将是这样,但在这里它是恒定的;无论如何,它将运行 3 次。即使它取决于位数,我也希望线性运行时间,而不是 2^n。

标签: algorithm time-complexity


【解决方案1】:

不要用 3 和 5 思考。想想如何计算 20 亿 x 20 亿(大约 2^31 乘以 2^31)

您的输入是 31 位 (N),您的循环将被执行 20 亿次,即 2^N。

所以,书是正确的。对于 5x3 的情况,3 是 2 位。所以复杂度是O(2^2)。再次正确。

【讨论】:

  • 是的。我知道给定的运行时也是正确的,但我只是想知道为什么它使用 O(2^n) 来表示它 O(y)。显示时间复杂度的更好方法吗?
  • 基本上是的。这是显示复杂性的更好方法。让我再详细说明一下:最初的复杂性分析始于图灵机(使用磁带输入),并且由于状态是恒定的,因此复杂性主要取决于输入的长度。并且输入可以是任何基数(基数 2、基数 10、基数 36 等),但分析是在输入的基数 2 表示中完成的,因此不同机器/算法之间的复杂度数可以比较。而且现代计算机也是建立在二进制系统上的,几乎在任何地方都使用二进制更有意义。
【解决方案2】:

您声称输入的时间复杂度为 O(y),而这本书声称输入的位数的时间复杂度为 O(2n) .好消息:你们都是对的!如果一个数 y 可以用 n 位表示,则 y 最多为 2n - 1。

【讨论】:

    【解决方案3】:

    我认为你误读了书中的段落。

    当这本书谈论计算两个数字的乘积的算法时,它使用乘以 3 × 5 的例子作为通过添加 y + y + 来计算 x × y 的更一般思想的具体实例。 . + y, x 总次数。并不是说特定算法“add 5 + 5 + 5”运行时间为 O(2n)。相反,想想这个算法:

    int total = 0;
    for (int i = 0; i < x; i++) {
        total += y;
    }
    

    这个算法的运行时间是 O(x)。如果您将运行时间作为数字 x 中位数 n 的函数来衡量 - 正如本书所建议的那样 - 那么运行时间是 O(2n),因为要表示数字 x 你需要 O(log n) 位。这是polynomial time and pseudopolynomial time 之间的区别,而这本书接着描述了一个更好的算法来解决这个问题的原因是,运行时最终成为一个多项式用于表示输入的位数 而不是在数字的数值中。关于小学乘法和加法的阐述可以帮助您更好地了解这两个数量之间的差异。

    【讨论】:

    • 感谢您的回答。与本书不同,我使用数值来表示时间复杂度。嗯..我是否必须使用用于表示数字的位数来表示时间复杂度?
    • 这取决于上下文。将区别放在脑后绝不是一个坏主意,尤其是当您使用的输入可以任意大时。
    • 啊。好的。感谢您的时间和帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2020-03-21
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多