假设我们有一个数组,我们希望找到它的K个最小值:
有两种方法:
1.使用快速选择算法(O(n)时间复杂度和O(1)空间)
2.使用最小堆数据结构(O(NlogK)时间复杂度和O(K)空间)
我想知道什么时候比另一个更受欢迎。
我猜他们都可以分发。
答案 0 :(得分:1)
选中out: -
快速选择而不是排序或堆
由于对整个数据集进行排序非常慢,因此选择是有意义的 前K个项目,只排序少数'顶部'元素 在整个数据集按页面排序时对用户的印象 通过结果集。这将给出O的运行时间(k * log(k)+ n)与O(n * log(n))相反,如果K合理,则速度快得多 小(例如几百)。
另一种方法是使用堆并继续弹出 当我们收到N时,最小的数字同时放回一个更大的数字 数字作为流。这将与O(n * log(K))运行时间一起使用 当我们测试N时,堆保存K个元素,因此高度为log(K) 尽管预计运行时间大于 快速选择和排序组合。