【发布时间】:2018-11-09 18:13:23
【问题描述】:
假设你有一个长度为 n 的未排序数组。现在你想从数组中取出 k 最大的元素。我们也知道n远大于k。
我的幼稚想法是对数组进行排序并输出 k 最大的元素。那将花费 O(nlog(n))。有没有更有效的算法可以利用 n 远大于 k 的事实?
【问题讨论】:
假设你有一个长度为 n 的未排序数组。现在你想从数组中取出 k 最大的元素。我们也知道n远大于k。
我的幼稚想法是对数组进行排序并输出 k 最大的元素。那将花费 O(nlog(n))。有没有更有效的算法可以利用 n 远大于 k 的事实?
【问题讨论】:
是的,确实存在更有效的算法。
获取k个第一个元素,构建包含这k个元素的min-heap。
遍历其他元素。如果当前项大于堆顶,则删除顶部并插入当前项。
结束堆之后会包含k个最大的元素。
复杂度为O(N*logK)
还要考虑平均时间为 O(n) 的 QuickSelect 算法(虽然它的最坏情况是二次的)
【讨论】: