如何在O(n)时间内找到列表中的k个最大整数?

时间:2013-06-15 02:04:28

标签: list time linear

如何在O(n)时间内找到列表中的k个最大整数?有人能给我一个伪代码吗?

2 个答案:

答案 0 :(得分:1)

一种简单的方法是将列表转换为堆并弹出k次。在Python中,可以使用heapq模块完成此操作。

import heapq

numbers = [6,1,32,8,2,1,9,77,12,-643,-6,3]

def getKLargest(nums, k):
    nums = [-x for x in nums]
    heapq.heapify(nums)
    for _ in xrange(k):
        yield -heapq.heappop(nums)

print list(getKLargest(numbers, 5))
print sorted(numbers, reverse=True)[:5]

答案 1 :(得分:-1)

我认为复杂性可能是O(n),而不是严格的O(n)。

  public static void swap(int[] a, int m, int n) {
    if (a[m] != a[n]) {
      a[m] ^= a[n];
      a[n] ^= a[m];
      a[m] ^= a[n];
    }
  }
  public static int partition(int[] a, int l, int h) {
    int i = l - 1;
    int p = l + (int) (Math.random() * (h - l));
    swap(a, p, h);
    for (int j = l; j < h; j++) {
      if (a[j] >= a[h]) {
        i++;
        swap(a, i, j);
      }
    }
    swap(a, i + 1, h);
    return i + 1;
  }
  public static void topK(int[] a, int l, int h, int k) {
    if (h - l + 1 >= k) {
      int p = partition(a, l, h);
      if (p - l + 1 == k) {
        return;
      } else if (p - l + 1 < k) {
        topK(a, p + 1, h, k - (p - l + 1));
      } else {
        topK(a, l, p - 1, k);
      }
    }
  }