Algorithm 当输入大小改变时,为什么算法的优先级会改变

Algorithm 当输入大小改变时,为什么算法的优先级会改变,algorithm,time-complexity,mergesort,insertion-sort,Algorithm,Time Complexity,Mergesort,Insertion Sort,我正在研究算法的时间复杂性。这本书解释说 插入排序的运行时间为O(n^2) 合并排序的运行时间为O(n logn) 当n较小时,插入排序更好,而当n较大时,合并排序更好 我不理解这个概念,为什么会这样?当输入大小不同时,为什么算法的优先级会不同 隐藏常数 给定一个大小为n的输入,假设您得到两个执行以下数量比较的插入和合并排序实现*: -插入排序:8n^2属于O(n^2) -合并排序:64nlogn属于O(nlogn) 然而,如果你8n^2复杂度的研究是用来观察随着问题规模的增长,程序的效率是如何

我正在研究算法的时间复杂性。这本书解释说

插入排序的运行时间为O(n^2)

合并排序的运行时间为O(n logn)

当n较小时,插入排序更好,而当n较大时,合并排序更好

我不理解这个概念,为什么会这样?当输入大小不同时,为什么算法的优先级会不同

隐藏常数

给定一个大小为n的输入,假设您得到两个执行以下数量比较的插入和合并排序实现*:
-插入排序
8n^2
属于
O(n^2)

-合并排序
64nlogn
属于
O(nlogn)


然而,如果你
8n^2复杂度的研究是用来观察随着问题规模的增长,程序的效率是如何变化的。如果您的输入大小没有定义的边界,这将非常有用

但是,如果您的问题大小有一个定义的界限,例如
n
小于60,那么求解算法的复杂度对您将没有用处:具有O(1)复杂度的算法可能比具有O(n2)复杂度的算法慢

当算法AB具有更低的大O(最坏情况)时间复杂度时,通常您可以认为这意味着存在
N
,因此A将更快地解决所有大于
N
的问题

更准确地说,这意味着对于大于
n
的任何
n
,算法A的大小
n
的最坏情况问题总是比算法B的大小
n
的最坏情况问题更快(步骤更少)(通常,这些将是完全不同的问题!)

在编程中,big-O复杂性理论很有用,但仅在它如何帮助我们理解平均案例复杂性(更难分析)方面。在您的示例中,对于较大的问题大小,使用合并排序而不是插入排序,这不是因为big-O复杂性,而是因为平均案例复杂性(在本例中,这与Big-O复杂性相同)

例如,在实践中,大O复杂性并不重要(即使我们关心任意大的问题规模):

  • 快速排序,O(n2),平均值(n对数(n))
  • 合并排序,O(n个日志(n)),平均值(n个日志(n))
因为平均复杂度是相同的,我们无法在没有更多分析的情况下判断谁更快。这有点像打破平局。这项分析的结果是著名的(我从来没有看过):快速排序速度明显更快(与它的平均大小写复杂度相关的乘法常数更低)。这意味着,如果排序元素的数量任意大,则快速排序始终是最佳选择,因为平均而言,它会更快

最后,当你看一看算法中的步骤时,一个具有更高“隐藏乘法常数”的算法有时是显而易见的,但在实践中,这实际上是较少的数学性和更多的实验性在您的算法中,算法是由处理器执行的,这取决于它的体系结构、您如何使用编程语言来指导它、处理器如何缓存/获取内存、操作系统的系统调用过程等

总之:可以肯定的是,如果算法A具有更好(更低)的平均情况比算法B复杂,则存在一些
N
,其中A对于大于
N
的问题实例,平均比B更快地解决问题。我们可以测量性能以查找(或近似查找)最低的
N
。如果算法A与另一个相比显然是赢家,那么
N
可能是
0
,但具有讽刺意味的是,低复杂度的算法往往更复杂,通常在每一步执行更多的分析,这会产生一些开销,使它们在小问题实例中运行得更慢

FinalFinal注释:如果您可以找到最低的
N
,那么对于大小大于
N
的问题,算法A总是比算法B快,那么这实际上并不意味着相反:可能不存在大小小于
N'
将通过B更快地解决。如果存在这种
N'
,则通常存在一个“中间”大小范围,其中两个选项之间的主要效率会发生变化,如下所示:

  • 1-83,B更快
  • 84-92,A更快
  • 93-111,B更快
  • 112以后,A更快

如果问题在大小约为90(超过一毫秒左右)时解决得很慢,那么我们可能会进行全范围检查,看看哪个是最好的。否则,我们可能只会说
If(n>111)做A
,即使我们知道有一些实例将由B解决,而A会更快地解决。如果在较小范围内做B的效率效益不够显著,我们可能总是选择A很容易看出你是否绘制了ose函数具有正确的常数。它在这里


另一个事实是,当n越小,计数排序就越好。