【问题标题】:Algorithm is linear (O(n)) to size of input, but what if input size is exponential算法对输入的大小是线性的 (O(n)),但是如果输入大小是指数的怎么办
【发布时间】:2021-02-16 14:07:58
【问题描述】:

讲师说,算法的复杂性通常是根据其输入大小来衡量的。

所以,当我们说一个算法是线性的,那么即使你给它一个 2^n 的输入大小(比如 2^n 是二叉树中的节点数),算法仍然是线性的输入尺寸?

以上似乎是导师的意思,但我很难在脑海中转过它。如果你给它一个 2^n 的输入,它是某个参数“n”的指数,然后称这个输入为“x”,那么,当然,你的算法对 x 是线性的。但在内心深处,它不仍然是“n”的指数吗?说它与 x 成线性有何意义?

【问题讨论】:

  • 既然您是提议调用输入 x 的人,您似乎有责任证明这样做是合理的。
  • 32 = 2^532=4*8。一种说法不会使另一种说法错误。但是,一个表示 32 为指数,另一个表示为线性乘法。
  • 随心所欲地定义它,但如果您在二叉树上运行典型的遍历,事实仍然存在,每个节点都被访问一次。因此,将算法视为线性“深层”似乎是错误的。
  • 这是一个快速而肮脏的想法 - 线性算法线性增长处理时间。或者足够接近线性。因此,假设处理 n=1 需要 2 毫秒。使用n=10 需要 20 毫秒。使用n=100 需要 200 毫秒。所以,即使你给它一个输入 2^101024 - 线性关系意味着它应该需要 2048 毫秒才能完成。 “如果你给它一个 2^n 输入”——这不是n 真正衡量的。您的“指数”输入只是表示为n=2^x,而不是2^nn 是输入的大小,而不是您修改输入大小的大小。
  • @puf 节点数不是“指数”。节点的数量是任何节点的数量。我们没有定义“n 上升的速度有多快”让您提出这样的要求。为了确定算法的复杂性,我们查看它与输入相关的行为。输入如何或什至 if 只能以特定数字(与任何数字相反)表示是无关紧要的。此外,这种情况很少见。

标签: algorithm time-complexity complexity-theory


【解决方案1】:

每当你看到“线性”这个词时,你应该问——线性在什么方面?通常,当我们将算法的运行时间称为“线性时间”时,我们的意思是“算法的运行时间是 O(n),其中 n 是输入的大小。”

您问的是如果 n = 2k 会发生什么,并且我们将指数大小的输入传递给函数。在这种情况下,由于运行时间为 O(n) 且 n = 2k,因此整体运行时间为 O(2k)。这句话与算法以线性时间运行这一事实之间没有矛盾,因为“线性时间”意味着“作为输入大小的函数的线性”。

请注意,我明确选择在表达式 2k 中使用不同的变量 k,以提醒大家注意这里确实有两个不同的量 - 输入的大小作为k 的函数(即 2k)和变量 n 更一般地表示函数输入的大小。您有时会看到这种组合,例如“如果算法的运行时间是 O(n),那么在大小为 2n 的输入上运行算法需要时间 O(2n支持>)。”这句话是对的,但解析起来有点棘手,因为 n 在那里扮演着两个不同的角色。

【讨论】:

    【解决方案2】:

    如果算法具有线性时间复杂度,那么无论输入大小如何,它都是线性的。无论是固定大小的输入、二次型还是指数型。

    显然,在固定大小的数组、二次或指数上运行该算法需要不同的时间,但复杂度仍然是O(n)


    也许这个例子会帮助你理解,在一个大小为 16 的数组上运行合并排序是否意味着合并排序是 O(1),因为它需要不断的操作来对该数组进行排序?答案是否定的。

    【讨论】:

    • running that algorithm on a fixed size array, quadratic or exponential will take different time - 这个说法没有意义。如果数组的大小为 16,则大小是固定的,二次 (4^2) 和指数 (2^4)。
    【解决方案3】:

    当我们说一个算法是O(n)时,意味着如果输入大小是n,它与输入大小是线性的。因此,如果n 在另一个参数k(例如n = 2^k)方面是指数的,那么就输入大小而言,该算法也是线性的。

    另一个例子是对大小为n 的输入数组进行二分搜索的时间复杂度。我们说对大小为n 的排序数组的二分搜索在O(log(n)) 中。这意味着关于输入大小,最多需要渐近比较 log(n) 来搜索大小为 n 的输入数组中的项目,

    【讨论】:

      【解决方案4】:

      假设您正在打印前 n 个数字,并且要打印每个数字需要 3 次操作:

      n-> 10,操作次数 -> 3 x 10 = 30

      n-> 100,操作次数 -> 3 x 100 = 300

      n-> 1000,操作次数 -> 3 x 1000 = 3000

      n ->10000,我们也可以说,n = 100^2(比如 k^2), 操作次数 --> 3 x 10000 = 30,000 尽管 n 是某事物的指数(在本例中为 100),但我们的操作数量仅取决于输入的数量(n 为 10,000)。

      所以我们可以说,它是线性时间复杂度算法。

      【讨论】:

        猜你喜欢
        • 2016-01-11
        • 2022-07-22
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多