【发布时间】:2015-08-20 12:11:31
【问题描述】:
我知道我们可以通过 2 种方式从 n 个未排序的整数中找到 k 个最大数:
- 使用快速选择之类的算法找到第 K 个最大的数字,然后我们可以得到第 k 个最大的数字。时间复杂度为O(n),空间复杂度为O(n)
- 使用堆来存储 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