快速选择时间复杂度说明

时间:2019-07-08 18:38:35

标签: algorithm time-complexity quickselect

https://en.wikipedia.org/wiki/Quickselect中说

“但是,快速选择仅递归到一侧(包含要搜索的元素的一侧),而不是像快速排序那样递归到两侧,这将平均复杂度从O(n log n)降低到O(n ),最坏的情况是O(n ^ 2)。“

我不明白如何减少到只看一侧就能将平均复杂度降低到O(n)?是不是更多的O(N / 2 log N)仍然是O(N log N)。以及最坏的情况O(n ^ 2)

3 个答案:

答案 0 :(得分:1)

n log(n)表示该算法查看所有N个项目log(n)次。但这不是Quickselect发生的事情。

假设您正在使用Quickselect来选择128个列表中的前8个项目。通过一些随机选择的奇迹,您选择的枢轴始终位于中间点。

在第一次迭代中,该算法查看所有128个项目,并将其分为两组,每组64个项目。下一次迭代分为两组,每组32个项目。然后是16,然后是8。检查的项目数是:

N + N/2 + N/4 + N/8 + N/16

该系列的总和永远不会达到2 * N。

最糟糕的情况是,分区总是导致分区大小非常不对称。考虑如果第一个分区仅删除一个项目会发生什么情况。第二个只删除了一个,依此类推。结果将是:

N +(N-1)+(N-2)...

哪个是(n^2 + n)/2)或O(n ^ 2)。

答案 1 :(得分:0)

一张价值一百行的图片:

这种序列的总和将无限接近于1但不等于1。

答案 2 :(得分:0)

当我读到平均时间复杂度为 O(n) 而我们每次将列表分成两半(如二分搜索或快速排序)时,我也感到非常矛盾。为了证明只看一侧将平均运行时复杂度从 O(n log n) 降低到 O(n),让我们比较快速排序(2 侧)和快速选择(1 侧)的时间复杂度递推关系。

快速排序:

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)

我希望这能让您相信为什么从一侧看会有所不同!