繁体   English   中英

最坏情况时间复杂度为O(n)的算法总是比最坏情况时间复杂度为O(n ^ 2)的算法快吗?

[英]Is an algorithm with a worst-case time complexity of O(n) always faster than an algorithm with a worst-case time complexity of O(n^2)?

这个问题出现在我的算法类中。 这是我的想法:

我认为答案是否定的 ,具有最坏情况时间复杂度O(n)的算法并不总是比具有最坏情况时间复杂度O(n ^ 2)的算法快。

例如,假设我们有总时间函数S(n)= 99999999n和T(n)= n ^ 2。 然后显然S(n)= O(n)和T(n)= O(n ^ 2),但是对于所有n <99999999,T(n)比S(n)快。

这种推理有效吗? 我有点怀疑,虽然这是一个反例,但它可能是错误想法的反例。

非常感谢!

Big-O表示法没有说明任何给定输入的算法速度; 它描述了时间如何随着元素的数量而增加。 如果你的算法在恒定时间内执行,但那个时间是1000亿年,那么对于大范围的输入,它肯定比许多线性,二次甚至指数算法慢。

但这可能不是问题的真正问题。 问题是询问具有最坏情况复杂度O(N)的算法A1是否总是比具有最坏情况复杂度O(N ^ 2)的算法A2 ; 而且更快,它可能指的是复杂性本身。 在这种情况下,您只需要一个反例,例如:

  • A1具有正常的复杂度O(log n)但是具有最坏情况的复杂度O(n ^ 2)。
  • A2具有正常复杂度O(n)和最坏情况复杂度O(n)。

在这个例子中,A1通常比A2更快(即比例更好),即使它具有更大的最坏情况复杂度。

你在谈论最坏情况的复杂性,对于某些算法,最坏的情况在实际应用中永远不会发生。

说一个算法的运行速度比另一个快意味着它运行所有输入数据更快输入的所有尺寸。 因此,您的问题的答案显然是否定的,因为最坏情况下的时间复杂度不是运行时间的准确度量,它衡量最坏情况下操作数量的增长顺序。

实际上,运行时间取决于实现,而不仅仅是这个操作数量。 例如,人们必须关心分配的内存,缓存效率,空间/时间局部性。 显然,最重要的是输入数据之一。

如果您想要一个算法比其他算法运行得更快而具有更高的最坏情况复杂度的示例,请根据输入查看所有排序算法及其运行时间。

因为问题Always意味着仅仅找到一个反例就足以证明答案是否定的。

O(n ^ 2)和O(n logn)的例子,但O(n ^ 2)和O(n)也是如此

一个简单的示例可以是冒泡排序,您可以继续比较对,直到对数组进行排序。 冒泡排序为O(n ^ 2)。 如果在排序的数组上使用冒泡排序,它将比使用时间复杂度O(nlogn)的其他算法更快。

从各方面来说,你都是正确的,你在声明中提供了一个反例。 如果是考试,那么期间,它应该给你满分。

然而,为了更好地理解大O符号和复杂性,我将在下面分享我自己的推理。 我还建议你在困惑时总是考虑以下图表,尤其是O(n)和O(n ^ 2)行:

在此输入图像描述


Big-O表示法

第一次学习计算复杂性时自己的推理是,

Big-O符号表示足够大的输入,“足够”取决于确切的公式(使用图表,当比较O(n)和O(n ^ 2)线时n = 20),更高阶的一个将总是慢于低阶

这意味着,对于小输入不能保证更高阶的复杂度算法比低阶算法运行得慢。

但是Big-O表示法告诉你一个信息:当输入大小保持增加时,继续增加......直到“足够”的大小,在此之后,更高阶的复杂度算法将总是更慢 这种“足够”的尺寸保证存在*。


最糟糕的时间复杂性

虽然Big-O表示法提供算法运行时间的上限,但取决于输入结构算法的实现 ,它通常可能具有最佳复杂性,平均复杂度和最差复杂性。

着名的例子是排序算法:QuickSort vs MergeSort!

QuickSort,最坏情况为O(n ^ 2)

MergeSort,最坏的情况是O(n lg n)

但是, 快速排序基本上总是比合并排序更快

所以,如果你的问题是关于最坏情况复杂性,快速排序和合并排序可能是我能想到的最好的反例(因为它们都很常见且很有名)


因此,结合两个部分,无论从输入大小,输入结构,算法实现的角度来看,你的问题的答案都是NO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM