如何证明Quicksort是否具有特殊条件的O(n * lg n)?

时间:2012-10-18 03:54:32

标签: performance big-o quicksort

这是关于我的数据结构作业的问题之一:

假设我们有一个线性时间过程,保证为Quicksort找到一个pivot元素 至少1%的阵列小于或等于枢轴,并且至少1%大于或等于枢轴。 表明Quicksort将具有最坏情况复杂度O(n lg n)。

我知道快速排序的最坏情况一般是O(n ^ 2)。我读到,当所选枢轴的所有值都是所采集的最大值或最小值时,就会发生这种情况。

我的猜测是,由于给定条件,至少1%的数组更大,并且阵列的至少1%小于枢轴,这消除了枢轴是最小或最大元素的情况在集合中。因此它永远不会是O(n ^ 2)

这听起来不错吗?

1 个答案:

答案 0 :(得分:0)

此类问题的主要关键是显示只有O(log(n))步骤。

理想的快速排名递归

T(N) = 2T(N/2) + O(n)

我们可以通过主定理很容易地证明是O(NlogN)。

O(n)项是递归树的每个级别的因子;此外,在理想情况下,必须在每个级别处理所有元素;即使从技术上讲,大多数元素都会使递归树的位置远远超过其他元素,我们可以假设没有渐近损失,“最坏情况”会发生,并且所有元素都在每个级别处理。因此,我们必须做的就是证明在给定的假设下,递归树中最多有O(log(N))个步骤。

根据您的假设进行Quicksort递归:

T(N) = T(N/100) + T(99N/100) + O(n).

我们可以假设WLOG,一旦递归树的单个分支中有99个或更少的元素,最多只会发生一定数量的操作来对它们进行排序(因此,O(1)* O(n)= O(n)操作发生在底层;递归树既不收缩也不增长。

那么,我们如何证明整个树中的最大步数?好吧,我们遵循最不幸的元素!假设我们从N个元素开始。根据我们的假设,应该有50到99个元素,这些元素构成了我们实际关注的递归树级别最后一步的最大分支。他们所获得的最糟糕的操作都是99%的一部分。

因此,我们最多有99个元素由X迭代形成,被削减1%。这应该看起来像您之前应该看到的不同的递归树,即“几何减少”树。至于数学:

99 = N*(.99)^X
99/N = (1/.99)^-X
(1/.99)^X = N/99
log_(1/.99) (1/.99)^X = log_(1/.99) N/99
X = log_(1/.99) N/99

正如您所看到的,右侧的术语是O(log(N))。所以这是递归级别的最大数量,每个级别最多都是O(N)工作,所以总工作量是O(Nlog(N))。

我不确定你是否想要更严谨(从头开始解释真正的递归证明是很多工作),但这对大多数大学来说都是可以接受的......