如何分析算法?是什么让quicksort的最坏情况表现为O(n^2)
,而合并排序的最差表现为O(n log(n))
?
答案 0 :(得分:6)
这是整个学期的主题。最后,我们讨论的是在算法结束之前必须完成的操作数量的上限,作为输入大小的函数。我们不包括系数(即10N对4N ^ 2),因为对于N足够大,它不再重要。
如何证明算法的优点是非常困难的。它需要一个正式的证据,并且有许多技术。通常,一个好的特殊方法是计算算法产生的数据传递次数。例如,如果您的算法嵌套了for循环,那么对于每个N项,您必须运行N次。那通常是O(N ^ 2)。
对于合并排序,您将数据一次又一次地拆分。这需要log2(n)。对于每个拆分,您都会对数据进行传递,这样就可以得到N log(n)。
快速排序有点棘手,因为在一般情况下它也是n log(n)。你必须想象如果你的分区分割数据会发生什么,每次你只得到分区一侧的一个元素。然后,您需要将数据分割n次而不是log(n)次,这使得N ^ 2。快速排序的优点是它可以在适当的位置完成,并且我们通常接近N log(n)性能。
答案 1 :(得分:1)
quicksort和merge sort将数组拆分为两个,递归地对每个部分进行排序,然后合并结果。 Quicksort通过选择“pivot”元素并将数组分区为小于或大于枢轴来拆分。合并排序任意分割,然后以线性时间合并结果。在这两种情况下,单个步骤是O(n),并且如果每次将数组大小减半,则这将给出对数步数。所以我们期望O(n log(n))。
然而,快速排序的最坏情况是分割始终不均匀,因此您不会获得与n的对数成比例的多个步骤,而是与n成比例的多个步骤。合并排序分为两半(或尽可能接近),因此没有这个问题。
答案 2 :(得分:1)
这是算法课程资料的入门分析。
定义一个操作(即乘法),并根据空间或时间进行分析。
此操作按空间或时间计算。通常,分析是在时间为输入大小的因变量时执行的。
伪代码示例:
foreach $elem in @list
op();
endfor
将执行 n 操作,其中 n 的大小为@list
。如果你不相信我,请自己计算。
分析quicksort和mergesort需要一个相当水平的所谓的数学复杂性。松散地,你解决了从递归关系推导出的离散微分方程。
答案 3 :(得分:0)
如果输入数组已排序,那么快速排序将只是一种选择排序! 因为你并没有真正划分数组......你只是在每个周期中选择第一项
另一方面,合并排序将始终以相同的方式划分输入数组,无论其内容如何!
另请注意:当分区长度相等时,分而治之的最佳表现!
答案 4 :(得分:0)
分析算法是一项艰苦的工作,并且容易出错。我将其与一个问题进行比较,例如在桥牌游戏中我必须获得多少机会获得两个A。必须仔细考虑所有可能性,并且一定不要忽视ace可以以任何顺序到达。
因此,分析这些算法的工作是通过算法的实际伪代码,并添加最坏情况下的结果。接下来,我将用大刷子绘画。
对于快速排序,必须选择一个枢轴来拆分集合。如果运气不佳,则该集合每次将分为n-1个集合和1个集合,分为n个步骤,其中每个步骤表示检查n个元素。这到达N ^ 2
对于合并,排序一开始是将序列分为顺序序列。即使在最坏的情况下,这也意味着最多n个序列。可以将它们二乘二组合,然后将较大的集合二乘二组合,依此类推。但是,那些(最多)n / 2个第一组合处理的子集非常小,最后一步处理的子集的大小约为n,但是只有一个这样的步骤。到达N.log(N)