第k个最小元素的最大堆与最小堆

5 algorithm heap min-heap heapsort max-heap

我很难理解为什么找到第k个最小元素的解决方案使用最大堆方法。对于第k个最大元素,使用最小堆方法。使用最小堆来查找第k个最小元素是否更有意义,因为最小元素将始终是根?因此,如果要查找第3个最小的元素,则只需删除根两次,构建堆,然后得到第3个最小的元素。在最大堆中,最小不是根,那么为什么更好使用呢?对于数组中的升序或降序排序也是如此。我看到大多数人使用最大堆来提升。

And*_*kyy 4

事实上,我们可以同时使用 Min 和 Max 堆来查找第 k 个最小元素:

  1. 就像你所描述的那样,我们可以构建一个最小堆,然后在循环中提取第 k 个元素。

或者

  1. 我们可以只用 k 个元素构建最大堆。然后我们将其余元素与根进行比较,仅用比根小的元素替换根,因此最大堆总是有 k 个最小元素。

  • @mth1417我们需要比较所有元素才能构建最小堆。构建堆的复杂度是 O(n * log n),因此我们接触所有元素,并且对于每个元素,我们进行堆化,即 O(log n)。对于最大堆,我们只对 k 个元素进行 heapify,所以它的时间复杂度为 O(k * log k),然后我们只需将数组的其余部分与最大堆根进行比较,偶尔只对 k 个元素调用 heapify。因此,最大堆的复杂度为 O(n * log k),而最小堆的复杂度为 O(n * log n) + O(k * log n) 来提取 k 个最小元素。 (3认同)