Algorithm 使用重复值快速选择

Algorithm 使用重复值快速选择,algorithm,selection,multiset,quickselect,Algorithm,Selection,Multiset,Quickselect,是否可以在多集上执行O(n)中的第k个元素搜索(值可以重复) 因为就我对快速选择的理解而言,我必须使用一些pivot对输入进行分区。然后我有两个数组,我选择递归搜索取决于我搜索的索引元素+两个数组的大小,例如: 1 7 8 5 3 2 4 假设pivot为4,我正在搜索第二大元素。所以在划分之后,我可能会得到如下顺序 1 3 247 8 5 因为右边的子数组由3个元素组成,如果我是正确的,我仍然会尝试在右边的数组中找到第二大元素 但如果我以8为支点,我可能会得到 1 3 2 7 5 48 因此,

是否可以在多集上执行O(n)中的第k个元素搜索(值可以重复)

因为就我对快速选择的理解而言,我必须使用一些pivot对输入进行分区。然后我有两个数组,我选择递归搜索取决于我搜索的索引元素+两个数组的大小,例如:

1 7 8 5 3 2 4

假设pivot为4,我正在搜索第二大元素。所以在划分之后,我可能会得到如下顺序

1 3 247 8 5

因为右边的子数组由3个元素组成,如果我是正确的,我仍然会尝试在右边的数组中找到第二大元素

但如果我以8为支点,我可能会得到

1 3 2 7 5 48

因此,我将尝试在左表中找到最大的元素(可能是线性的,但通常我将使用左子数组并搜索元素-(|右子数组大小|+1))

但是多集呢?假设我有一个数组:

4567774321

我的轴心是第三大元素,在分区之后我收到:

45324416777

所以,若我使用上面介绍的方法,我将尝试在右边的子数组上执行递归,而第三个最大值是5,它在左边

我提出的唯一解决方案是使用一些数据结构,如BST、Set等,以O(nlogn)过滤掉重复。然后使用O(n)快速选择。然而,总的来说,它会给我非线性的方法,这可以线性完成吗



我还有一个额外的问题,如果无法分配内存怎么办?我能做的就是只使用局部整数+堆栈递归。这个问题可以用O(n)来解决吗?因为O(nlogn)可以通过排序+线性“遍历计数”来完成。

我认为这取决于您对“第k个最大元素”的解释。如果“第k个最大元素”的意思是“如果排序后将位于数组中k位置的元素”,那么quickselect将不作修改地工作

另一方面,如果您的意思是“数组中第k个最大的不同值”,那么您可以正确地认为未修改的quickselect无法正常工作,如您的示例所示。但是,您可以通过将所有元素添加到哈希表中,然后在哈希表上迭代以获得每个不同值的一个副本,来修改算法,使其在预期的O(n)时间内工作。从这里开始,您可以在生成的数组上使用普通的quickselect算法,这将需要总共O(n)个预期时间


希望这有帮助

老实说,我没有想过HT。但它应该是有效的。无论如何,我也在等待其他建议。如果有:)我想稍微改变一下这个问题。当分配额外内存时,什么是最快的方法不是有效的操作。我只能使用带有元素的begin数组(只能分配O(1)内存+递归堆栈)。这可以在nlogn或n中完成。限制意味着我不能使用结构。我回答自己,O(nlogn)可以通过简单地对它排序+找出多少邻域值在线性时间内变化来完成。所以这是一个愚蠢的问题。但仍然是组合:没有额外的内存+O(n)是可访问的?