【问题标题】:Can't understand particalur Big-O example in textbook无法理解教科书中的特殊 Big-O 示例
【发布时间】:2017-03-27 21:16:55
【问题描述】:

到目前为止,理解 Big-O 表示法及其计算方式是可以的……大多数情况都很容易理解。但是,我只是遇到了一个我一生都无法弄清楚的问题。

方向:为表达式选择最佳的大 O 表示法。

(n^2 + lg(n))(n-1) / (n + n^2)

答案是 O(n)。这一切都很好,但考虑到分子中的n^3 因素,这如何合理化? n^3 不是最好的,但我认为f(n) <= O(g(n)) 之间有一个“最小”基础?

这本书没有解释任何数学内部运作,所有东西都被注入了一个可能的解决方案(取f(n)并生成一个略大于f(n)g(n))。

有点难过。如果必须的话,对数学或数学引用发疯。

另外,给定一段代码,如何确定每行的时间单位?您如何根据一行代码(或多行代码)确定对数时间?我知道声明和设置变量被视为 1 个时间单位,但是当事情变得糟糕时,我将如何解决?

【问题讨论】:

    标签: big-o logarithm


    【解决方案1】:

    如果你把这个算法扔进 Wolfram Alpha,you get this generic result:

    如果你展开(FOIL)它,你会(大致)得到一个三次函数除以一个二次函数。使用 Big-O,常数无关紧要,更大的力量获胜,所以你会得到something like this

    剩下的就是数学归纳法。相对于越来越大的 n 值,整个算法以类似线性的方式增长。它不是相当线性的,所以我们不能说它具有 (n) 的 Big-Omega,但由于摊销的恒定增长率,它确实相当接近 O(n)。 p>

    或者,你可以惹恼各地的数学家说,“由于这是基于 Big-O 规则,我们可以从分母中去掉 n 的因子,从而通过简单的除法得到 O(n)。”但是,在我看来,重要的是要考虑到这仍然不是相当线性的。

    请注意,这是一个不太严格的解释,可能会让您的班级满意,但这会让您对其运行时有一些基于数学的看法。

    【讨论】:

    • 太棒了,感谢您的澄清。我假设,随着时间的推移,开发出色的基于时间的程序会变得更容易或更直观?我正在利用自己的时间处理 CS 领域,只是阅读书籍并继续前进……单打它让我更加兴奋并且对材料有更深入的理解。
    • 识别您编写的算法的运行时间是一项至关重要的技能,因为它通常意味着代码性能好与差的区别。随着时间的推移,它会变得更加简单,因为它能够分析您的代码。
    • 很高兴知道,期待未来。谢谢,诚
    【解决方案2】:

    不严谨的回答:

    1. 分发分子积,发现分子为n^3 + n log(n) - n^2 - log n
    2. 我们注意到,对于大的n,分子增长为n^3,对于大的n,分母增长为n^2
    3. 我们将其解释为n^{3 - 2} 用于大nO(n) 的增长。

    【讨论】:

    • 哦,太棒了。那么可以产生这些类型的影响吗?这非常有帮助。关于什么类型的代码会导致 lg(n)lg(lg(n)) 性能的任何想法?
    • 当您可以执行解空间的递归拆分时,通常会出现对数复杂性。例如二分查找是log_2(n)
    • 好的,当我开始阅读这本惊人的大型算法介绍书时,我会牢记这一点……希望未来!谢谢亮星
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2021-04-02
    相关资源
    最近更新 更多