当前位置: 首页 > 知识库问答 >
问题:

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

邢寒
2023-03-14

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

Quickselect在一般情况下以线性时间运行,但是数组的组合确实会扩展搜索空间,但它比使用合并策略更有效,因为如果选择了好的枢轴,Quickselect必然允许忽略某些元素。

共有1个答案

解晟睿
2023-03-14

Quickselect与quicksort非常相似,因为它的分而治之策略。2之间的不同之处在于,Quickselect将只对包含第k个最小元素的部分数据重复出现,并将一直持续到间隔等于k值,这意味着它已经找到了第k个最小值(https://www.geeksforgeeks.org/Quickselect-algorithment/)。关于你的问题,我认为你说的是对的,这取决于你在重复时得到的枢轴。在最好的情况下,时间仍然需要O(n)(因为Quickselect只搜索拆分数据的1部分,n的大小取决于您的数据集),在最坏的情况下,当选择了错误的枢轴时,时间仍然需要O(n^2)。为了使该算法得到推广,很难为每一组数据找到“最佳可能”的枢轴。

在考虑首先使用堆作为方法时,当给定数据时,首先构建堆需要O(n)个时间。为了找到第k个最小的项,堆中的最小元素,即根,必须被找到k次。移除一个min堆中的min只需要1个团队,但是在移除根之后对堆进行堆化将需要O(logn)时间,根据您所讨论的输入大小,这可能会增加相当大的成本。因此,堆方法的总时间为O(1)+O(klogn),其中k是第k个最小的数。

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

 类似资料:
  • 我有n个数组。这些数组中的每一个都可以是无限长的。(长度可以可变)。所有这n个数组都被排序了。

  • 我知道以前有人问过这个问题,但这个问题是关于我的具体代码。我试图做一个psuedo-QuickSelect算法,将k与排序矩阵子区间的中点进行比较。 我一直收到一个超时错误。 以下是矩阵: 下面是我的代码: 我将元组传递给,其中包含区间的endpoint的。因此,如果我想搜索整个矩阵,我会传递和。将查看子区间,根据endpoint的行号确定中点,计算小于中点的元素数量,将其与进行比较。如果小于小于

  • 这可能是微软的面试问题。 从排序的数组中找出第k个最小的元素(忽略重复项) [编辑]:数组可能包含重复项(未指定)。 想了很多次,但仍然质疑自己:还有更好的解决方案吗? 取最大堆 时间复杂度:O(NlogK) 空间复杂度:O(K) 这些元素可能是重复的。所以,通过与以前的元素进行比较来检查是否有唯一的元素 还可以使用改进版的快速排序分区算法。但它可能会导致最坏的情况,因为数组已经排序<这里出现了两

  • 我的问题是受到这个特殊的SO评论的启发,这个评论没有得到回答(我自己也面临这个问题): 我试图找到排序矩阵中第K个最小的元素: 给定一个nxn矩阵,其中每个行和列都按升序排序,返回矩阵中第k个最小的元素 请注意,它是排序顺序中的第k个最小元素,而不是第k个独立元素 输入:矩阵=[[1,5,9],[10,11,13],[12,13,15],[12,13,15],k=8 输出:13 说明:矩阵中的元素

  • 本文向大家介绍n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N) ?相关面试题,主要包含被问及n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N) ?时的应答技巧和注意事项,需要的朋友参考一下  

  • 这是一个面试问题。 在具有排序行和列的矩阵中找到Kth最小元素。 Kth最小元素是中的一个,例如,这是否正确?