Algorithm 讨论小n的计算复杂性的正确方法

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)算法”。在形式理论

在讨论计算复杂性时,似乎每个人都会直奔大O

比如说,我有一个混合算法,比如merge-sort,它对较小的子数组使用插入排序(我相信这叫做平铺合并排序)。最终仍然是用O(n logn)进行合并排序,但我想讨论小n的算法的行为/特征,在实际没有合并的情况下

对于所有意图和目的,平铺合并排序都是插入排序,对我的小n的域执行完全相同的指令。然而,大O处理的是大的和渐近的情况,而讨论小n的大O几乎是一种矛盾修饰法。人们对我大喊大叫,因为我甚至认为“在这种情况下,行为就像一个O(n^2)算法”。在形式理论计算分析的背景下,描述小n情况下算法行为的正确方法是什么?澄清一下,不仅仅是在n很小的情况下,而且在n从来都不是大的情况下

有人可能会说,对于如此小的n,这并不重要,但我感兴趣的是,在这种情况下,它会起作用,例如,对于一个大常数,例如被执行多次,在实践中,它会显示出明显的趋势,并成为主导因素。例如,下图所示的初始二次增长。我并不是在否定Big O,而是在寻求一种恰当地讲述故事双方的方式


[编辑]

如果对于“小n”,常数可以很容易地去除生长速率的所有痕迹,那么

  • 仅讨论渐近情况,在这种情况下,与任何实际应用的相关性较小,或
  • 必须有一个阈值,在该阈值下,我们同意n不再是“小的”
  • 如果n不“小”(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