使用quickselect在n个排序的数组中找到第k个最大元素的时间复杂度

时间:2018-08-12 18:08:13

标签: arrays sorting

如果您有J个长度为N的排序数组,请在其中找到kth个最小的元素。 这里有一些潜在的解决方案,其中一些涉及最小堆或二进制搜索,但是我想知道使用快速选择的时间复杂度是多少。如果我们简单地将每个数组连接在一起,并在组合数组上使用quickselect。

Quickselect通常在线性时间运行,但是数组的合并确实扩大了搜索空间,但是它比使用合并策略更有效,因为如果选择好的枢轴,quickselect必然会忽略某些元素。

1 个答案:

答案 0 :(得分:0)

Quickselect与快速排序非常相似,因为它具有分而治之的策略。两者之间的区别在于,Quickselect仅会在保存第k个数据的那部分重复出现 最小元素,并且将一直持续到间隔等于k值为止,这意味着它找到了第k个最小值(https://www.geeksforgeeks.org/quickselect-algorithm/)。关于您的问题,我认为您说的对是正确的,这取决于您重复出现的关键点。在最佳情况下,时间仍然会花费O(n)(因为Quickselect仅搜索拆分数据的一部分,并且n的大小取决于您的数据集),而在最坏情况下,O(n ^ 2)选择了错误的枢轴。为了使该算法通用化,将很难为每个数据分组找到“最佳可能”枢轴。

在首先考虑使用堆作为方法时,给定数据时,首先需要O(n)时间来构建堆。为了找到第k个最小项,堆中的min元素(即根)必须找到k次。删除min堆中的min只需要1个团队,但是在删除根之后堆化堆将花费O(logn)时间,这可能会非常昂贵,具体取决于您正在讨论的输入大小。因此,堆方法的总时间为O(1)+ O(klogn),其中k是第k个最小数字。

基本上,效率的差异实际上取决于在Quickselect中如何选择支点以及考虑堆方法时输入的大小或k值。