【问题标题】:Is my interpretation for the complexity O(n + k log n) in this algorithm correct?我对该算法中复杂度 O(n + k log n) 的解释是否正确?
【发布时间】:2014-10-09 02:10:15
【问题描述】:

所以我们遇到了一个问题,如果给定一个包含 n 个元素的数组,我们需要从中提取 k 个最小的元素。我们的解决方案应该使用堆,复杂度应该是 O(n + k log n)。我想我可能已经找到了解决方案,但我想确定一下。

我想说,数组必须首先使用典型的 buildHeap() 函数构建到堆中,该函数从数组长度的一半开始并调用 minHeapify() 函数以确保每个父级至少小于其孩子们。总而言之,这将是 O(n) 复杂度。由于我们需要提取 k 次,我们将使用 extractMin() 函数,该函数将删除最小值和 minHeapify() 保留 Min Heap 属性的剩余部分。 extractMin() 将是 O(logn),因为它会执行 k 次,这支持 O(n+klogn) 的整体复杂度。

这会检查吗?有人告诉我它也应该使用 heapSort() 函数进行排序,但这对我来说没有意义,因为 heapSort() 会给整体复杂性增加 O(nlogn),而且你仍然可以提取分钟没有排序...

【问题讨论】:

  • 除非我不了解您的 buildHeap 和 minHeapify 函数,否则即使构建一个有效的堆也需要 n*log(n) 时间,因为如果元素放置错误,则需要平均情况 log(n ) 检查以找到合适的位置。
  • 一开始我也是这么想的,但几乎在我所到之处,buildHeap() 都被称为 O(n),所以我做了很多研究来找出原因。我刚刚选择了这个,所以我很难解释,但是 heapify() 不会在任何底部节点运行,并且每个级别最多会运行 1 次(我认为)。 Jeremy West 似乎在这个帖子中给出了最好的解释:link
  • 不错的链接,我以前不知道堆构建算法。所以是的,您的分析是正确的,不,您不需要在已经有效的堆上运行 heapSort()。

标签: algorithm data-structures big-o heap heapsort


【解决方案1】:

是的,你是对的。您不需要 heapSort() 而需要 heapify() 来重新排序您的堆。

【讨论】:

    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2011-07-09
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多