假设我有2个案例:
案例1:我总是选择第一个元素作为支点。在这种情况下,最坏的情况是O(n2)是阵列已经排序或反向排序。
案例2:我选择一个随机元素作为支点。这里最坏的情况是O(n2)是可能的,当随机枢轴总是在子阵列中的最大或最小元素。
我不能说如果给出随机数组,P(案例1中的O(n2))= P(案例2中的O(n2))。因为直观地P(排序数组或反向排序数组)= P(随机数据枢轴始终是子数组中的最大值或最小元素)?
如果是这样,第二种情况如何有益,因为我们需要额外的努力来选择随机枢轴?只有当数据遵循某种模式时,我们才需要第二种情况。我对吗?请指教。
答案 0 :(得分:2)
当输入的所有排列同样可能时,每次选择坏枢轴的概率对于两种策略(第一或随机)都是相同的。任何不进行比较的策略都是一样的(中间,第三,在前一个和第二个之间交替......)。
(对于比较元素的策略,这可能会有所不同,例如三个中位数。)
但事实是,在实践中,排列根本不具有等概率,并且对于几乎排序的序列存在强烈的偏见。
换句话说,当输入被很好地改组或当你随机选择枢轴时,你必须非常不走运,每次做坏图并且最坏情况的概率是无穷小的。对于排序的序列,赔率是完全不同的,因为你肯定会每次失败!
作为旁注,选择随机值确实具有成本,与小序列的划分相比,这是不可忽略的。这就是为什么切换到长度为L或更短的序列的更简单的排序,并将L的值调整到最佳值的原因。
答案 1 :(得分:0)
为避免最坏的情况,您必须为每个细分选择最佳枢轴:中间元素。如果你使用任何快捷方法来选择枢轴,如随机,首先,三个中位数或其他什么,那么可能会遇到最坏的情况。这只是一个概率问题。
某些输入案例可能会发生,至少在某些应用程序中,例如元素已经排序或接近排序的情况。
如果存在最坏情况行为的威胁,那么至少可以通过防止可能触发最坏情况行为的输入案例来缓解威胁。
答案 2 :(得分:0)
通过选择可预测的元素,就像第一个元素一样,你可以轻松地击中最坏的情况。如果添加了一粒随机性,则该模式可能会被破坏,并且在某些时候,排序算法的实际运行时间将低于O(N ^ 2)。
在相关的说明中,随机选择枢轴也不是一个好主意。有些技术,例如中位数的中位数,可以证明最坏情况的运行时间仍为O(NlogN)。与将第一个元素作为支点相比,这是一个巨大的优势。
您可以根据中位数的中位数来参考本文的实施:Finding Kth Smallest Element in an Unsorted Array
答案 3 :(得分:-1)
当我们给出一个随机生成的数组时,我们并不担心运行时。当数组被排序或接近排序时,我们担心运行时,这实际上很常见。我们还担心运行时阵列是由对手生成的,其中的元素是专门用来破坏我们的日子的。
如果它只是随机输入,选择第一个元素作为枢轴就可以了。