【问题标题】:How is O(n log n) different then O(log n)? [closed]O(n log n) 与 O(log n) 有何不同? [关闭]
【发布时间】:2017-02-14 23:46:53
【问题描述】:

研究大 O 表示法,我理解 O(log n) 作为二分查找和 O(n log n) 作为快速排序的概念。

谁能通俗地说一下runtime这两者之间的主要区别是什么?为什么会这样?

它们在直觉上似乎具有相似的相关性

【问题讨论】:

  • 他们完全不同:bigocheatsheet.com
  • 既然n log nlog n 是不同的函数,增长得更快,为什么它们应该一样呢? n 有很大的不同:如果 log 是基数 2 和 n = 1000n log n9965.8log n 只是 9.97
  • 我不知道反对票。 Stack Overflow 上的许多人似乎比过去缺乏耐心。
  • 这个问题绝对不会太宽泛。这是一个有具体答案的具体问题。这个问题的结束是不公正的。
  • 也许“太宽泛”在这里是错误的标记,但是这个问题仍然有资格被关闭:与编程没有直接联系并且明显缺乏研究的 CS 问题(研究 bigO 意味着:阅读定义!; log n -> binary-search + n log n -> quick sort 的映射不仅是错误的,如果它是正确的也是危险的,如果理解 bigO 表示法是目标)。 (我也希望已经有数百个类似的问题)

标签: algorithm time big-o


【解决方案1】:

基本上:N的一个因子。
二进制搜索只涉及少量元素。如果有 10 亿个元素,二分搜索只会触及其中的约 30 个。
快速排序会触及每一个元素,但次数很少。如果有 10 亿个元素,则快速排序会接触所有个元素,大约 30 次:总共约 300 亿次接触。

【讨论】:

  • 是二进制搜索的用例,输入必须是有序的,而快速排序是随机输入的最佳情况?
  • 二进制搜索在有序列表中找到一个值。快速排序是一种对列表进行排序的方法。它们根本没有真正的关系。
  • 好的,我明白你的意思了...我想我需要知道二进制搜索必须有有序的输入
  • 只是一个小问题:它是 20,而不是 30
  • @NiklasB.:哎呀。切换到“十亿”,其中 30 仍然准确。
【解决方案2】:

看看Log(n) 是如何平坦的(不是字面意思,而是比喻,与其他函数相比),而nLog(n) 在 n = 100 的值上超过了 600。这就是它们的不同之处。

【讨论】:

  • Log(n) 不是相当平坦。
  • 我的意思是答案说它平坦的。那里需要一个限定符。
  • 所有日志都彼此成比例,因此在 big-O 中,基数并不重要。然而,在分析分治算法时会弹出以 2 为基数,因此在图中使用以 2 为基数可以更好地粗略了解较小示例的相对运行时间。
  • 我知道这是一个有用的图表。
【解决方案3】:

在简单的术语和可视化上,它们在排序算法中是一样的,但是快速排序因为 O(n log n) 在某些情况下存在缺陷,快速排序大多数情况下是 log n,但在特殊情况下是 ,这就是 nlog n 之前的原因。所以对于少量排序的快速排序是非常好的,但对于数百万/十亿则不是,最好使用 Merge Sort 进行这种排序。

【讨论】:

  • 或者,由于快速排序比归并排序快得多,所以改用Introsort,这通常与快速排序一样快,但不会达到 n^2。
  • “快速排序大多数情况下是 log n,但在特殊情况下是 n²,这就是为什么 n 在 log n 之前”没有什么意义。你真的想说吗?快速排序 从不 log n 并且没有一般定理说如果算法是 O(n^2) 最坏情况,那么平均复杂度是 O(n log n) - 这是快速排序的一个非常特殊的属性。
  • 您似乎混淆了订单。 log N 顺序只是 N 的一小部分(通常是一点点,因为如果递归地除以 N,对数的底数是 2一半)。如果不至少检查数组的所有 N 个元素,就无法执行排序,因此 N 是最低顺序限制。
猜你喜欢
  • 2011-12-12
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多