是否有可能在多重集中执行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)快速选择。但总的来说它会给我非线性方法,这可以做到线性吗?
我还有一个额外的问题,如果不能分配内存怎么办?而我能做的只是使用本地int +堆栈递归。这个问题可以在O(n)中解决吗?因为O(nlogn)可以通过排序+线性“完成计数”来完成。
答案 0 :(得分:2)
我认为这取决于你对“第k大元素”的解释。如果通过“第k个最大元素”表示“如果对数组进行排序,那么它将位于数组中的位置k”,那么quickselect将无需修改即可使用。
另一方面,如果你的意思是“数组中第k个最大的不同值”,那么你是正确的,未经修改的quickselect将无法正常工作,如你的例子所示。但是,您可以通过将所有元素添加到哈希表中来修改算法,使其在预期的O(n)时间内工作,然后遍历哈希表以获取每个不同值的一个副本。从那里,你可以在生成的数组上使用正常的quickselect算法,这需要总共O(n)的时间。
希望这有帮助!