【问题标题】:Use of asymptotic notation渐近符号的使用
【发布时间】:2024-01-18 20:50:01
【问题描述】:


我对这个特定问题有疑问,答案说 big-Oh(n^2) 算法不会比 big-Oh(n^3) 算法运行得更快,而如果这两种情况下的符号都是 theta,那么本来是真的,但为什么会这样呢?

如果有人可以向我详细解释,我会很高兴,因为我找不到任何可以澄清我的疑问的来源。

【问题讨论】:

    标签: algorithm complexity-theory


    【解决方案1】:

    第 1 部分的释义(请注意,问题中的措辞在“数字”被量化的地方是模棱两可的——它必须在您选择两种算法之后选择,但我认为这就是预期的结果)。

    给定具有 f=Theta(n^2) 和 g=Theta(n^3) 的函数 f 和 g,那么存在一个数 N,使得对于所有 n>N,f(n)

    第 2 部分释义:

    给定函数 f 和 g,其中 f=O(n^2) 和 g=O(n^3),那么对于所有 n,f(n)

    1 为真,可以应用 big-Theta 的定义来证明。

    2 是错误的(作为一般性陈述),您可以通过找到一个 f 和 g 为错误的示例来反驳它。例如,f(n) = 2, g(n) = 1。大 O 是一种上界,所以这些常数函数起作用。问题中给出的反例为 f(n)=n, g(n)=log(n),但原理相同。

    【讨论】:

      【解决方案2】:

      答案说 big-Oh(n^2) 算法不会比 big-Oh(n^3) 算法运行得更快

      更微妙的是:O(?²) 算法可能比 O(?³) 算法运行得更慢。不是,而是

      答案给出了一个原因,但实际上有两个:

      1. 大 O 表示法只给出 界。引用自*:

        用大 O 表示法对函数的描述通常只提供函数增长率的上限。

        所以任何 O(?) 也是 O(?²) 和 O(?³),但不一定反之亦然。答案是 O(?³) 的算法可能有一个更严格的界限,即 O(log?)。的确,这听起来很傻,因为当它也是 O(log?) 时,为什么还要说它是 O(?³)?那么只讨论 O(log?) 似乎更合理。这就是我们通常做的事情。但还有第二个原因:

      2. 第二个选项在其声明中没有约束“n > number”。这是必不可少的,因为无论时间复杂度如何,对于给定的 ? 值,算法的运行时间都无法从其时间复杂度中确定。 O(?log?) 的算法可能需要 10 秒才能完成工作,而 O(?²) 的算法可能需要 8 秒才能获得相同的结果,即使它的时间复杂度更差。在比较时间复杂度时,您只能获得关于渐近行为的信息,即当 ? 大于足够大的数字时。

        因为这个额外的约束是第一个声明的一部分,它确实是真的。

      【讨论】:

      • 我理解第一个原因,但我不清楚你写的第二个原因。我想我明白为什么陈述 2 在问题中是错误的,但为什么第一个是正确的对我来说仍然是模糊的。请用你的知识指导我。
      • 这来自大 O 的 定义。检查formal definition on Wikipedia,其中 x0 是选项 1 中提到的常量“数字”。我在我的答案应该能说明这一点。