Algorithm 讨论小n的计算复杂性的正确方法
在讨论计算复杂性时,似乎每个人都会直奔大O 比如说,我有一个混合算法,比如merge-sort,它对较小的子数组使用插入排序(我相信这叫做平铺合并排序)。最终仍然是用O(n logn)进行合并排序,但我想讨论小n的算法的行为/特征,在实际没有合并的情况下 对于所有意图和目的,平铺合并排序都是插入排序,对我的小n的域执行完全相同的指令。然而,大O处理的是大的和渐近的情况,而讨论小n的大O几乎是一种矛盾修饰法。人们对我大喊大叫,因为我甚至认为“在这种情况下,行为就像一个O(n^2)算法”。在形式理论计算分析的背景下,描述小n情况下算法行为的正确方法是什么?澄清一下,不仅仅是在n很小的情况下,而且在n从来都不是大的情况下 有人可能会说,对于如此小的n,这并不重要,但我感兴趣的是,在这种情况下,它会起作用,例如,对于一个大常数,例如被执行多次,在实践中,它会显示出明显的趋势,并成为主导因素。例如,下图所示的初始二次增长。我并不是在否定Big O,而是在寻求一种恰当地讲述故事双方的方式Algorithm 讨论小n的计算复杂性的正确方法,algorithm,big-o,computation-theory,Algorithm,Big O,Computation Theory,在讨论计算复杂性时,似乎每个人都会直奔大O 比如说,我有一个混合算法,比如merge-sort,它对较小的子数组使用插入排序(我相信这叫做平铺合并排序)。最终仍然是用O(n logn)进行合并排序,但我想讨论小n的算法的行为/特征,在实际没有合并的情况下 对于所有意图和目的,平铺合并排序都是插入排序,对我的小n的域执行完全相同的指令。然而,大O处理的是大的和渐近的情况,而讨论小n的大O几乎是一种矛盾修饰法。人们对我大喊大叫,因为我甚至认为“在这种情况下,行为就像一个O(n^2)算法”。在形式理论
[编辑] 如果对于“小n”,常数可以很容易地去除生长速率的所有痕迹,那么
让我把问题转过来。我有一张显示分段超线性步骤的图表。听起来很多人都会说“这纯粹是巧合,它可以是任何可以想象的形状”(当然是极端情况),如果它是正弦波,就不会眨眼。我知道在很多情况下,形状可以被常数隐藏,但在这里它是很明显的。我怎样才能正式解释为什么图形会产生这种形状 我特别喜欢@Sneftel的话“不精确但有用的指导” 我知道大O和渐近分析是不适用的。是什么?我能走多远
对于小n,计算复杂性——当n向无穷大增加时,事物如何变化——没有意义,因为其他效应占主导地位 我所看到的讨论小值n的行为的论文是通过测量实际系统上的算法来实现的,并且讨论了算法在实践中的表现,而不是从理论的角度。例如,对于你在文章中添加的图,我会说‘这个图总体上显示了一个O(N)渐近行为,但每个图块内的增长是有界二次的’
我不知道在什么情况下,从理论角度讨论这种行为会有意义——众所周知,对于小n来说,实际影响超过了扩展的影响。复杂性不是一台机器上一个
n
的执行时间,因此,即使常量很大,也不需要考虑它。复杂性告诉您输入的大小如何影响执行时间。对于较小的n
,可以将执行时间视为常量。这是一面
从第二方面来说,你是在说:
O(n logn)
中工作,用于n
大于一些k
和O(n^2)
中,用于n
小于k
k
太大,算法运行缓慢O(n logn)
时间复杂度中执行,但有一个较大的常数。因此,在正常机器上,在某些情况下,它可能工作缓慢(即比更简单的解决方案慢)。在分析复杂性时,不必考虑它。当你在系统中实现它时,你需要考虑它:你需要检查它是否是最好的选择,考虑到它将运行的实际机器和它将要解决的问题。 < P>你是正确的。< /P>
对于较小的n
,即仅执行插入排序时,渐近行为为二次O(n^2
)
对于较大的n
,当平铺合并排序开始起作用时,行为切换到O(n.Log(n))
如果您记住,每个行为都有其有效性域,在切换阈值之前,让N
,以及切换阈值之后,就没有矛盾了
实际上,N
周围的曲线之间会有平滑的混合。但在实践中,N
的值太小,以至于二次行为没有足够的“空间”来表现自己
处理这种分析的另一种方法是说,
N
是一个常数,插入排序需要恒定的时间。但我不同意说这是必须的。让我们把东西打开一点。大O是一个工具f