如果您有J
个长度为N
的排序数组,请在其中找到kth
个最小的元素。
这里有一些潜在的解决方案,其中一些涉及最小堆或二进制搜索,但是我想知道使用快速选择的时间复杂度是多少。如果我们简单地将每个数组连接在一起,并在组合数组上使用quickselect。
Quickselect通常在线性时间运行,但是数组的合并确实扩大了搜索空间,但是它比使用合并策略更有效,因为如果选择好的枢轴,quickselect必然会忽略某些元素。
答案 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值。