algorithm – 使用重复值快速选择

是否有可能在多重集中执行O(n)中的搜索kth elment(值可以重复)?

因为据我所知,快速选择的想法我必须使用一些支点来分区输入.然后我有2个数组,我选择进行递归搜索取决于我正在搜索哪个索引元素,例如:两个数组的大小:

1 7 8 5 3 2 4

让我们说枢轴是4我正在寻找第二大元素.所以在分区后我可能会得到顺序

1 3 2 4 7 8 5

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

但如果我把8作为一个支点,我可能会得到类似的东西

1 3 2 7 5 4 8

因此我将尝试在左表中找到最大的元素(可能通过线性,但一般来说我将采用左子阵列并搜索元素 – (|右子阵列大小| 1))

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

4 5 6 7 7 7 4 3 2 1

我的分支是6搜索第3个最大的元素,我收到分区后:

4 5 3 2 4 1 6 7 7 7

因此,如果我使用上面提到的方法,我将尝试在右子阵列上执行递归,而显然第三个最大值是5,它在左边?

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

我还有一个额外的问题,如果不能分配内存怎么办?而我能做的只是使用本地ints栈递归.这个问题可以在O(n)中解决吗?因为O(nlogn)可以通过排序线性“通过计数”来完成.

最佳答案 我认为这取决于你对“第k大元素”的解释.如果通过“第k个最大元素”表示“如果对数组进行排序将在数组中的位置k的元素”,那么quickselect将无需修改即可工作.

另一方面,如果你的意思是“数组中第k个最大的不同值”,那么你是正确的,未经修改的quickselect将无法正常工作,如你的例子所示.但是,您可以通过将所有元素添加到哈希表中来修改算法,使其在预期的O(n)时间内工作,然后遍历哈希表以获取每个不同值的一个副本.从那里,您可以在生成的数组上使用常规的快速选择算法,这将需要总共O(n)的预期时间.

希望这可以帮助!

点赞