哪个更好:O(n log n)或O(n ^ 2)

use*_*272 38 algorithm big-o

好的,所以我有这个项目我必须做,但我只是不明白.问题是,我有2个算法.O(n ^ 2)和O(n*log 2 n).

无论如何,我在项目信息中发现,如果n <100,则O(n ^ 2)更有效,但如果n> = 100,则O(n*log 2 n)更有效.我想用一个例子来演示使用数字和单词或绘制照片.但问题是,我不明白这一点,我不知道如何证明这一点.

这里的任何人都可以帮我理解这是如何工作的?

提前干杯!

编辑:谢谢大家的回复.

Sta*_*tas 66

好问题.实际上,我总是展示这3张照片:

n = [0; 10]

在此输入图像描述

n = [0; 100]

在此输入图像描述

n = [0; 1000]

在此输入图像描述

所以,O(N*log(N))远胜于O(N^2).它是更接近O(N)比O(N^2).

但是你的O(N^2)算法N < 100在现实生活中更快.有很多原因可以让它更快.可能是由于更好的内存分配或其他"非算法"效果.也许O(N*log(N))算法需要一些数据准备阶段或O(N^2)迭代更短.无论如何,Big-O表示法仅适用于足够大的Ns.

如果你想证明为什么一个算法对于小N更快,你可以测量1次迭代的执行时间和两种算法的恒定开销,然后用它们来纠正理论图:

例

在此输入图像描述

或者只是测量两种算法的执行时间以用于不同的Ns和绘制经验数据.

  • 非常需要的解释。感谢您提供图像和比较。 (2认同)

Ori*_*iol 30

如果你有疑问,请问wolframalpha.

在这种情况下,它说

     n log(n)
lim --------- = 0
       n^2
Run Code Online (Sandbox Code Playgroud)

或者您也可以自己计算限额:

     n log(n)        log(n)   (Hôpital)       1/n          1
lim --------- = lim --------      =     lim ------- = lim --- = 0
       n^2             n                       1           n
Run Code Online (Sandbox Code Playgroud)

这意味着n^2增长得更快,因此n log(n)更小(更好),当n足够高时.


zmb*_*mbq 16

Big-O表示法是渐近复杂性的表示法.这意味着它在N任意大时计算复杂度.

对于小Ns,还有很多其他因素.算法可能有O(n ^ 2)循环迭代,但每次迭代都很短,而另一种算法有O(n)次迭代,迭代次数很长.对于大Ns,线性算法将更快.对于小Ns,二次算法将更快.

因此,对于小N,只需测量两个,看看哪个更快.无需进入渐近复杂性.

顺便说一下,不要写日志的基础.Big-O表示法忽略常量 - O(17*N)与O(N)相同.由于log 2 N是公正的ln N / ln 2,因此对数的基础只是另一个常数而被忽略.

  • +1表示值范围的大端很重要。没有人关心10或100个元素。 (2认同)
  • @JensG,也许有人在乎100多个元素,因为这是他们必须解决的问题。渐进复杂性对您没有帮助。 (2认同)

Kha*_*d.K 8

我们来比较一下,

一方面我们有:

n^2 = n * n
Run Code Online (Sandbox Code Playgroud)

另一方面,我们有:

nlogn = n * log(n)
Run Code Online (Sandbox Code Playgroud)

把它们放在一边:

n * n    versus    n * log(n)
Run Code Online (Sandbox Code Playgroud)

让我们除以n哪个是一个常用术语,得到:

n    versus    log(n)
Run Code Online (Sandbox Code Playgroud)

让我们比较一下价值:

n = 10           log(n) ~ 2.3
n = 100          log(n) ~ 4.6
n = 1,000        log(n) ~ 6.9
n = 10,000       log(n) ~ 9.21
n = 100,000      log(n) ~ 11.5
n = 1,000,000    log(n) ~ 13.8
Run Code Online (Sandbox Code Playgroud)

所以我们有:

n >> log(n) for n > 1

n^2 >> n log(n) for n > 1
Run Code Online (Sandbox Code Playgroud)

  • @ Khaled,基数的值是多少,我想到2,它的log 10值(基数2)为3.32,可否确认一次? (2认同)