【问题标题】:Is it possible to find the k-largest numbers from n unsorted integers with time complexity O(n) and space complexity O(k)?是否可以从时间复杂度 O(n) 和空间复杂度 O(k) 的 n 个未排序整数中找到 k 个最大数?
【发布时间】:2015-08-20 12:11:31
【问题描述】:

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

  1. 使用快速选择之类的算法找到第 K 个最大的数字,然后我们可以得到第 k 个最大的数字。时间复杂度为O(n),空间复杂度为O(n)
  2. 使用堆来存储 k 最大的数字并遍历 n 个整数,然后将适当的整数添加到堆中。时间复杂度为O(nlogk),空间复杂度为O(k)

假设 n 个整数在一个流中,我们不能随机访问它们

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

【问题讨论】:

  • 为什么你认为快速选择的空间复杂度为 O(N)。它有 O(1) 额外的内存复杂度(假设你可以重新排列输入)
  • 这是可行的。见link.springer.com/chapter/10.1007%2FBFb0015429通过使用这个算法,你可以在线性时间内找到第k个最大的数,只有恒定数量的附加变量。

标签: algorithm


【解决方案1】:

是的。在用 k 个元素填充堆后,不是在每次插入后从堆中逐出一个元素,而是在每 k 次插入后从堆中逐出 k 个元素。那么你就不再需要堆结构了——每次都选择就好了。

【讨论】:

  • 这听起来不错。在我看来,你实际上并不需要一个堆,只需要一个有 2k 个位置的数组。
【解决方案2】:

k 次冒泡排序将在数组 timeo(nk) 的最后给出 k 个最大元素

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 2015-05-25
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多