algorithm - 快速选择时间复杂度解释

标签 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)

最佳答案

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)。

关于algorithm - 快速选择时间复杂度解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940793/

相关文章:

algorithm - 是否可以使用搜索功能枚举集合中的所有项目

time-complexity - 递归运行时 - 空间复杂性(Cracking the Coding Interview 第 44 页)

Python Quickselect不打印/返回枢轴

algorithm - 快速选择不适用于所有索引

algorithm - 计算有向无环图中的传入边

JavaScript 函数 'return' 值?

string - 如何查找字符串 S 是否包含在由 S 组成的字符串中,该字符串插入到 S 本身的任何位置(仅一次)

Java:循环字符串长度时间复杂度

algorithm - 不同的方式 int n 可以分成 1 或 2 组

c - 快速选择中的分区