Algorithm Quickselect的平均运行时间

Algorithm Quickselect的平均运行时间,algorithm,big-o,Algorithm,Big O,Wikipedia声明quickselect算法()的平均运行时间为O(n)。然而,我不清楚这是怎么回事。有人能向我解释一下(通过递归关系+主方法用法)平均运行时间是多少O(n) 因为 我们已经知道所需元素所在的分区 我们不需要(通过对所有元素进行分区)排序,只需要对我们需要的分区进行操作 与快速排序一样,我们必须将元素分成两半*,然后再分成两半,但这一次,我们只需要在元素所在的两个分区中的一个分区中进行下一轮分区 就像(不是很准确) n+1/2 n+1/4 n+1/8 n+2N 所以它是O(

Wikipedia声明quickselect算法()的平均运行时间为O(n)。然而,我不清楚这是怎么回事。有人能向我解释一下(通过递归关系+主方法用法)平均运行时间是多少O(n)

因为

我们已经知道所需元素所在的分区

我们不需要(通过对所有元素进行分区)排序,只需要对我们需要的分区进行操作


与快速排序一样,我们必须将元素分成两半*,然后再分成两半,但这一次,我们只需要在元素所在的两个分区中的一个分区中进行下一轮分区

就像(不是很准确)

n+1/2 n+1/4 n+1/8 n+2N

所以它是O(n)


一半用于方便,实际分区不是精确的50%。

在quickselect中,按照指定,我们只对分区的一半应用递归。

一般案例分析:

第一步:T(n)=cn+T(n/2)

式中,cn=执行分区的时间,其中c是任何常数(无所谓)
T(n/2)=在分区的一半上应用递归。
由于这是一个平均情况,我们假设分区是中位数

当我们继续进行递归时,我们得到以下方程组:

T(n/2)=cn/2+T(n/4)
T(n/4)=cn/2+T(n/8)


T(2)=c.2+T(1)
T(1)=c.1+…

对方程求和并交叉抵消相似值会产生线性结果。

c(n+n/2+n/4+…+2+1)=c(2n)//一个GP的和


<>所以,<强> o(n)<强> >/p>进行一个快速选择的平均情况分析,必须考虑在每一对元素的算法中比较两个元素的可能性和假设随机旋转。由此我们可以得出平均比较次数。不幸的是,我将展示的分析需要一些更长的计算,但它是一个干净的平均案例分析,而不是当前的答案

让我们假设要从中选择第k个最小元素的字段是
[1,…,n]
的随机排列。我们在算法过程中选择的轴心元素也可以看作是给定的随机排列。在算法过程中,我们总是从这个排列中选择下一个可行支点,因此它们被随机均匀地选择,因为每个元素与随机排列中的下一个可行元素具有相同的发生概率


有一个简单但非常重要的观察结果:我们只比较两个元素
i
j
(与
i相比,当我读到quickselect的平均时间复杂度为O(n),而我们每次将列表分成一半时(如二进制搜索或快速排序),我也感到非常矛盾。事实证明,每次将搜索空间分成两半并不能保证O(logn)或O(nlogn)运行时。使quicksort O(nlogn)和quickselect的原因是O(n)对于快速排序,我们总是需要探索递归树的所有分支,而对于快速选择,我们只需要探索单个分支。让我们比较一下快速排序和快速选择的时间复杂度递归关系,以证明我的观点

快速排序:

T(n) = n + 2T(n/2)
     = n + 2(n/2 + 2T(n/4))
     = n + 2(n/2) + 4T(n/4)
     = n + 2(n/2) + 4(n/4) + ... + n(n/n)
     = 2^0(n/2^0) + 2^1(n/2^1) + ... + 2^log2(n)(n/2^log2(n))
     = n (log2(n) + 1)      (since we are adding n to itself log2 + 1 times)
快速选择:

T(n) = n + T(n/2)
     = n + n/2 + T(n/4)
     = n + n/2 + n/4 + ... n/n
     = n(1 + 1/2 + 1/4 + ... + 1/2^log2(n))
     = n (1/(1-(1/2))) = 2n                           (by geometric series)

我希望这能让您明白为什么quickselect的平均运行时间是O(n)。

在最坏的情况下是O(n^2)dante-平均情况是O(n),最坏情况是O(n^2),因为正如您所说,分区不能保证为50%。例如,在一个10元素数组中,如果您每次选择最差的分区,您将得到n+9/10n+8/10n+…+1/10n,即n^2。有关更详细的解释,请参阅。如果分区保证为50%,则正好是n/2。使用几何集的和ric级数公式a1/(1-q)@SHAREDD但不是大Oh只用于测量最坏情况吗?@CommittedDroyer否,它用于对以一定渐近速度最大增长的函数进行分类。因此,在这种情况下,它意味着期望值(在随机均匀输入时)对于某些常数C,运行时的增长速度不会超过函数C*N。这不是一般情况下的分析。对于平均情况分析,你必须考虑每一个可能的枢转,而不仅仅是枢轴元素的期望值。谢谢,这是我正在寻找的严格答案。在分析案例1时有一个错误。$\和{d=1}{k-1}\neq\sum{d=1}{k-1}\frac{d+1}$@johndoe我恐怕不明白。在案例1的分析中,你是指换行后的相等吗?这来自$\frac{d+1}=\frac{d+1}{d+1}-\frac{d+1}-\frac{1}之前的{d+1}意思可能是相等that@johndoe这只是“颠倒”总和。对于左侧,总和的第一项为(k-1)/(d+1),最后一项为1/(d+1);对于右侧,第一项为1/(d+1),最后一项为(k-1)/(d+1)。因此,总和相等。