其中c++有一个函数被调用std::nth_element,它可以在线性时间内找到数组的第 n 个元素。使用此函数,您应该找到第N - n- 个元素(其中N是数组中元素的总数)并从中减去 1。
当您寻求解决方案时,C您无法使用此功能,但您可以类似地实施您的解决方案。nth_element执行与 qsort 非常相似的操作,但它仅对数组中第 n 个元素所在的部分执行分区。
现在让我们假设你已经nth_element实现了。我们将执行类似二分搜索和nth_element. 首先我们假设问题的答案是数组的中间元素(即第 N/2 个元素)。我们使用nth_element并找到第N/2th 个元素。如果它比N/2我们知道的更多,那么您的问题的答案至少是N/2,否则它会更少。无论哪种方式,为了找到答案,我们只会继续使用N/2第 th 个元素创建的两个分区之一。如果这个分区是正确的(大于 的元素N/2),我们继续解决相同的问题,否则我们开始搜索第一个元素M左侧的最大元素,该N/2元素至少具有x更大的元素,使得x + N/2 > M. 这两个子问题将具有相同的复杂性。您继续执行此操作,直到您感兴趣的间隔为 length 1。
现在让我们证明上述算法的复杂度是线性的。第一个nth_element是按 的顺序线性执行操作N,第二个nth_element是只考虑数组的一半将按N/2第三个顺序执行操作 -N/4依此类推。总而言之,您将按N + N/2 + N/4 + ... + 1. 这个总和小于2 * N因此您的复杂性仍然是线性的。
您的解决方案比我上面建议的要慢,因为它具有复杂性O(n*log(n)),而我的解决方案具有O(n).