你如何看待O(log n)和O(n log n)之间的差异?

时间:2010-06-12 15:04:52

标签: complexity-theory big-o

二进制搜索的平均案例性能为O(log n),快速排序O(n log n)O(n log n)与O(n)+ O(日志n)相同

5 个答案:

答案 0 :(得分:35)

想象一下与世界上每个人的数据库。这是67亿条目。 O(log n)是对索引列(例如主键)的查找。 O(n log n)在未索引的列上按排序顺序返回整个总体。

  • O(log n)在你读完那句话的第一个单词之前就完成了。
  • O(n log n)仍在计算...

想象它的另一种方式:

log n与n中的位数成比例。

n log n是n倍。

尝试编写一次1000次,而不是写一千次。第一个需要O(log n)时间,第二个需要O(n log n)时间。

现在再次使用6700000000进行尝试。写一次仍然是微不足道的。现在尝试写入67亿次。即使你每秒钟写一次,你也会在你完成之前就死了。

答案 1 :(得分:24)

您可以在绘图中将其可视化,例如参见here

enter image description here

答案 2 :(得分:3)

不,O(n log n) = O(n) * O(log n)

在数学中,当你有一个表达式(即e = mc ^ 2)时,如果没有运算符,那么你就乘以。

通常,可视化O(n log n)的方法是“做一些需要log n次计算n次的事情。”

如果您有一个首先在列表上迭代的算法,那么对该列表进行二进制搜索(这将是N + log N),您可以表达,就像{{1}因为O(n)使n的大值log n相形见绌n相形见绌

答案 3 :(得分:2)

(log n)图增加,但是向下凹,这意味着:

  • 当n变大时会增加
  • 增加率减少 当n变大时

(n log n)图增加,并且(略微)向上凹,这意味着:

  • 当n变大时会增加
  • 增加率(略) 当n变大时增加

答案 4 :(得分:0)

取决于您是否倾向于将n视为具有具体价值。

如果您倾向于将n视为具有具体价值,并且f(n)的单位是时间或指示,则O(log n)nO(n log n)倍1}}用于大小为n的给定任务。对于内存或空间单位,O(log n)对于大小为n的给定任务,nf(n)倍。在这种情况下,您将关注某些已知n的{​​{1}}的密码域。您可以直观地看出问题的答案,这些问题涉及事情需要多长时间或此操作消耗多少内存。

如果您倾向于将n可视化为具有任何值的参数,那么O(log n)可扩展nO(log n)n可以完成nf(n)次任务。在这种情况下,您将专注于n的域。您可以直观地查询有关f(n)可以获得多大的问题的答案,或者您可以并行运行多少{{1}}个实例。

两种观点都不比另一种好。前者可用于比较解决特定问题的方法。后者可用于比较给定方法的实际局限性。