【问题标题】:Max heap vs Min heap for kth smallest element第 k 个最小元素的最大堆与最小堆
【发布时间】:2019-04-11 03:08:55
【问题描述】:

我无法理解为什么寻找第 k 个最小元素的解决方案使用最大堆方法。对于第 k 个最大的元素,采用最小堆方法。使用 min heap 来查找第 k 个最小的元素不是更有意义吗,因为最小的元素总是根?因此,如果我们想找到第三小的元素,那么我们只需删除根 2 次,构建堆,就可以得到第三小的元素。在最大堆中,最小的不在根,那么为什么使用它更好呢?对数组中的升序或降序数字进行排序也是如此。我看到大多数人使用最大堆来提升。

【问题讨论】:

    标签: algorithm heap heapsort min-heap max-heap


    【解决方案1】:

    其实我们可以同时使用 Min 和 Max heap 来找到第 k 个最小的元素:

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

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

    【讨论】:

    • 但是你怎么知道你在第 k 个最小元素?在您知道它是否是第 k 个最小的之前,您不需要将数组中的所有元素与末尾进行比较吗?
    • @mth1417 当然,首先你需要用前 k 个元素构建一个小的最大堆,然后我们需要将数组的其余部分与最大堆根进行比较。但是要构建最小堆,您还需要比较所有数组元素。最重要的是,我们需要提取 k 个元素,其中 k 可能与 n 一样大...
    • 如果最小的总是在根,为什么还需要比较最小堆中的所有元素,你只需要检查根?
    • @mth1417 我们需要比较所有元素以构建最小堆。构建堆的复杂度是 O(n * log n),所以我们接触所有元素,并且对于每个元素,我们进行 O(log n) 的堆化。对于 Max Heap,我们只为 k 个元素进行 heapify,所以它是 O(k * log k),然后我们只是将数组的其余部分与 Max Heap 根进行比较,偶尔只为 k 个元素调用 heapify。所以 Max Heap 的复杂度是 O(n * log k),而 Min Heap 的复杂度是 O(n * log n) + O(k * log n) 来提取 k min 个元素。
    • 很抱歉,当提取总是第一个元素时,我不明白为什么提取是 O(k*log n)
    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 2015-01-15
    • 2018-11-29
    • 2019-08-13
    • 2013-09-25
    • 2020-05-08
    • 2014-05-07
    • 2018-06-02
    相关资源
    最近更新 更多