【问题标题】:Why is O(n) better than O( nlog(n) )?为什么 O(n) 比 O( nlog(n) ) 好?
【发布时间】:2019-10-23 16:11:39
【问题描述】:

我刚刚发现了这个奇怪的发现,在正常的数学中,n*logn 会小于 n,因为 log n 通常小于 1。 那么为什么 O(nlog(n)) 大于 O(n) 呢? (即为什么认为 nlogn 比 n 花费更多时间)

Big-O 遵循不同的系统吗?

【问题讨论】:

  • log n 对于n > 10 的每个值都大于 1(对于以 10 为基数的日志)。
  • 基本上nlogn 中的log 是基数2。所以对于任何n >= 2,你都有logn >= 1。所以有那个...

标签: algorithm data-structures time-complexity big-o


【解决方案1】:

...因为 log n 总是小于 1。

这是一个错误的前提。事实上,logbn > 1 对于所有 n > b。例如,log2 32 = 5。

通俗地说,你可以把logn想象成n中的位数。如果 n 是 8 位数字,则 log n ≈ 8。对于大多数 n通常大于 1 /em>,因为大多数数字都有多个数字。

【讨论】:

    【解决方案2】:

    此图表可能会有所帮助。 log (n) 比 n 上升得更快,并且当 n 大于对数的底时大于 1。 https://stackoverflow.com/a/7830804/11617347

    【讨论】:

      【解决方案3】:

      如果 n 大于 b,Log(n) 可以大于 1。但这并不能回答您为什么 O(n*logn) 大于 O(n) 的问题。

      通常底数小于 4。因此对于较大的值 n,n*log(n) 变得大于 n。这就是为什么 O(nlogn) > O(n)。

      【讨论】:

      • "通常底数总是小于 4。"基数通常既不小于 4,也不总是小于 4。例如,在 [octree]en.wikipedia.org/wiki/Octree) 中,基数是 8。我承认,您将在计算机科学课程中使用的最常见的数据结构将具有基数为 4 或更少,但现实世界不同。无论如何,基数通常远小于您在谈论算法分析时考虑的项目数,因此您可以假设 log(n) 将大于 1,而不管基数如何。
      【解决方案4】:

      原来,我误解了 Logn 小于 1。 当我问了我的几个前辈时,我今天自己才知道,如果 n 的值很大(通常是,当我们考虑 Big O 即最坏的情况时),logn 可以大于 1。

      是的, O(1)

      (我认为这是一个愚蠢的问题,也打算将其删除,但后来意识到,没有问题是愚蠢的问题,可能还有其他人对此感到困惑,所以我把它留在这里。)

      【讨论】:

        【解决方案5】:

        无论两个函数在n 的小值上表现如何,当n 足够大时,它们会相互比较。理论上,有一个N,这样对于每个给定的n > N,然后是nlogn >= n。如果选择N=10nlogn 总是大于n

        【讨论】:

          【解决方案6】:

          绘制两个图形(在 desmos (https://www.desmos.com/calculator) 或任何其他网络上),并在 n (y=f(n)) 的较大值上查看自己的结果。我是说您应该寻找较大的值,因为对于较小的 n 值,程序不会有时间问题。为方便起见,我在下面附上了一个图表,您可以尝试其他日志库。

          红色代表时间=n,蓝色代表时间=nlog(n)。

          【讨论】:

            【解决方案7】:

            在计算机中,它是以 2 为底数而不是以 10 为底数。所以 log(2) 是 1,而 log(n),其中 n>2,是一个大于 1 的正数。 只有在 log(1) 的情况下,我们的值小于 1,否则大于 1。

            【讨论】:

              【解决方案8】:

              对于更高的 log n 值,它变得大于 1。当我们考虑 n 的所有可能值时,我们可以说大多数时间 log​​ n 大于 1。因此我们可以说 O(nlogn) > O( n)(假设更高的值)

              【讨论】:

                【解决方案9】:

                这是流行的时间复杂度图表
                n*log(n) 明显大于 n 对于 n>2(以 2 为底的对数)

                一个容易记住的方法可能是,举两个例子

                1. 想象一下二分查找算法:O(log(n))
                2. 对于二分查找的每一步,您都会迭代 N 个元素的数组
                3. 结果将是 O(n*log(n))
                4. 这比对数组进行一次迭代更有效:O(n)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-04-10
                  • 2018-11-05
                  • 2018-10-24
                  • 1970-01-01
                  • 2012-01-03
                  • 1970-01-01
                  • 2014-06-13
                  • 2012-05-09
                  相关资源
                  最近更新 更多