是否有可能从时间复杂度为O(n)和空间复杂度为O(k)的n个未排序整数中找到k个最大的数?

时间:2015-08-20 12:11:31

标签: algorithm

我知道我们可以通过两种方式从n个未排序的整数中找到k个最大的数字:

  1. 使用像quick-select这样的算法来查找第K个最大数字,然后我们就可以得到k个最大的数字。时间复杂度为O(n),空间复杂度为O(n)
  2. 使用堆来存储k个最大的数字并迭代n个整数,然后将适当的整数添加到堆中。时间复杂度为O(nlogk),空间复杂度为O(k)
  3. 假设n个整数在流中,我们没有随机访问它们

    我想知道是否有可能从时间复杂度为O(n)和空间复杂度为O(k)的n个未排序整数中找到k个最大的数?

2 个答案:

答案 0 :(得分:5)

是的。在用k个元素填充堆之后,不是在每次插入后从堆中驱逐一个元素,而是在每次插入k之后从堆中驱逐k个元素。那么你不再需要堆结构 - 只需每次都选择。

答案 1 :(得分:-1)

k冒泡排序将在数组timeo(nk)

的最后给出k个最大元素