Algorithm O(n logn)算法是否总是优于所有O(n^2)算法?

Algorithm O(n logn)算法是否总是优于所有O(n^2)算法?,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,当试图正确理解Big-O时,我想知道O(n logn)算法是否总是优于allO(n^2)算法 是否有任何特殊情况下O(n^2)会更好 我已经读过多次,例如在排序中,当数据几乎被排序时,像气泡排序这样的O(n^2)算法可以特别快,因此它会比O(n log n)算法(例如合并排序)快吗?在这种情况下,O(n log n)渐进地优于O(n2) 大O,大θ,大ω,所有这些都度量函数的渐近行为,也就是说,当它们的参数趋于某个极限时函数的行为 O(n logn)函数的增长速度比O(n2)函数慢,这就是Big

当试图正确理解Big-O时,我想知道
O(n logn)
算法是否总是优于all
O(n^2)
算法

是否有任何特殊情况下
O(n^2)
会更好

我已经读过多次,例如在排序中,当数据几乎被排序时,像气泡排序这样的
O(n^2)
算法可以特别快,因此它会比
O(n log n)
算法(例如合并排序)快吗?在这种情况下,

O(n log n)渐进地优于O(n2)

大O,大θ,大ω,所有这些都度量函数的渐近行为,也就是说,当它们的参数趋于某个极限时函数的行为

O(n logn)函数的增长速度比O(n2)函数慢,这就是Big-O表示法的本质。然而,这并不意味着O(n logn)总是更快。这仅仅意味着在某个时刻,O(n logn)函数对于n的不断增加的值来说总是更便宜

在该图中,f(n)=O(g(n))。注意,存在一个范围,其中f(n)实际上比g(n)更昂贵,即使它是由g(n)渐近有界的。然而,当谈到极限或渐近性时,f(n)“从长远来看”优于g(n),

O(n log n)渐近性优于O(n2)

大O,大θ,大ω,所有这些都度量函数的渐近行为,也就是说,当它们的参数趋于某个极限时函数的行为

O(n logn)函数的增长速度比O(n2)函数慢,这就是Big-O表示法的本质。然而,这并不意味着O(n logn)总是更快。这仅仅意味着在某个时刻,O(n logn)函数对于n的不断增加的值来说总是更便宜


在该图中,f(n)=O(g(n))。注意,存在一个范围,其中f(n)实际上比g(n)更昂贵,即使它是由g(n)渐近有界的。然而,当谈到极限或渐近性时,f(n)“从长远来看”优于g(n)。

除了@cadaniluk的答案:

如果将算法的输入限制为非常特殊的类型,这也会影响运行时间。例如,如果仅对已排序的列表运行排序算法,则BubbleSort将以线性时间运行,但MergeSort仍需要O(n log n)。 还有一些算法的最坏情况复杂度很差,但平均情况复杂度很好。这意味着存在错误的输入实例,导致算法运行缓慢,但总的来说,不太可能出现这种情况


也不要忘记,大O符号隐藏了低阶的常数和加法函数。因此,一个最坏情况复杂度为O(n logn)的算法实际上可能有2^10000*n*logn的复杂度,而你的O(n^2)算法实际上可以以1/2^1000 n^2的速度运行。因此,对于n<2^10000,您确实希望使用“较慢”算法。

除了@cadaniluk的答案之外:

如果将算法的输入限制为非常特殊的类型,这也会影响运行时间。例如,如果仅对已排序的列表运行排序算法,则BubbleSort将以线性时间运行,但MergeSort仍需要O(n log n)。 还有一些算法的最坏情况复杂度很差,但平均情况复杂度很好。这意味着存在错误的输入实例,导致算法运行缓慢,但总的来说,不太可能出现这种情况

也不要忘记,大O符号隐藏了低阶的常数和加法函数。因此,一个最坏情况复杂度为O(n logn)的算法实际上可能有2^10000*n*logn的复杂度,而你的O(n^2)算法实际上可以以1/2^1000 n^2的速度运行。因此,对于n<2^10000,您确实希望使用“较慢”的算法。

不,
O(n logn)
算法并不总是比
O(n^2)
算法好。 Big-O表示法描述了算法的渐近行为的上界,即趋于无穷大的n

在这个定义中,你必须考虑一些方面:

  • Big-O表示法是算法复杂度的上限,这意味着对于某些输入(如您提到的排序算法),具有最差Big-O复杂度的算法实际上可能执行得更好(对于已排序的数组,气泡排序在
    O(n)
    中运行,而合并排序和快速排序总是至少需要
    O)(n日志n)
  • Big-O表示法只描述了复杂度的类别,隐藏了在实际情况下可能相关的所有常量因素。例如,一个复杂度
    1000000 x
    的算法在类
    O(n)
    中的性能比复杂度
    0.5 x^2
    的算法差(类
    O(n^2)
    )对于小于2000000的输入。基本上,大O表示法告诉您,对于足够大的输入n,
    O(n)
    算法的性能将优于
    O(n^2)
    ,但如果您使用小输入,您可能仍然更喜欢后一种解决方案
  • 不,
    O(n logn)
    算法并不总是优于
    O(n^2)
    算法。 Big-O表示法描述了算法的渐近行为的上界,即趋于无穷大的n

    在这个定义中,你必须考虑一些方面:

  • Big-O表示法是算法复杂度的上限,这意味着对于某些输入(如您提到的排序算法),具有最差Big-O复杂度的算法实际上可能执行得更好(对于已排序的数组,气泡排序在
    O(n)
    中运行,而合并排序和快速排序总是至少需要
    O)(n日志n)
  • 大O符号只有d