【问题标题】:Printing the k smallest values by order from small to largest in minimal heap in O(klog k)在 O(klog k) 的最小堆中按从小到大的顺序打印 k 个最小值
【发布时间】:2020-02-02 18:28:12
【问题描述】:

我有一个最小堆 Hn 元素。函数min(H,k) 按从小到大的顺序打印k 最小值。在方法结束时,H 仍然包含 n 值。我被要求在O(klogk)O(k) 额外空间中给出min(H,k) 的算法。在解决方案中,他们做了如下:

我们将使用一个额外的最小堆T 没有任何数据。它将包含原始最小堆H 的元素的副本(HT 的值之间将有一个双向指针)。算法:

  • O(1) 中打印H 的最小元素。
  • H的根的两个孩子插入T
  • 只要我们不打印 k 值就可以:
    • 打印T 的最小元素(我们称之为x)。
    • T 中删除x
    • 将堆Hx 的两个子代插入堆T(如果存在)。

我不明白为什么这个算法是有效的,什么是最糟糕的,我根本不明白这个算法。我知道我们创建了一个新堆T。我也明白为什么打印H 的最小元素是O(1)。我不明白“插入TH 的根的两个孩子”部分。它是将这些孩子的指针插入堆T 还是只是它们的值?如果答案是第二个选项,那么我怎么知道要遵循下一个选项?

【问题讨论】:

    标签: algorithm data-structures time-complexity heap


    【解决方案1】:

    T的元素必须让你在原始堆中获取元素和元素的位置。如果你能做到这一点,那么你可以找到下一个元素并找到值。

    各种表示方式都可以。例如,对于最小堆数组表示,您只需要知道数组的偏移量,以及数组长度和数组开头的全局常量。

    之所以如此有效,关键在于T 上的所有操作都是O(k) 大小的堆上的堆操作。因此他们每个人都接受O(log(k))。需要O(k) 操作,所以结果是O(k log(k))

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 2019-04-11
      • 2012-06-27
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      相关资源
      最近更新 更多