algorithm - 我对此算法的复杂度 O(n + k log n) 的解释是否正确?

标签 algorithm data-structures big-o heap heapsort

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

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

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

最佳答案

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

关于algorithm - 我对此算法的复杂度 O(n + k log n) 的解释是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269243/

相关文章:

c++ - 如何从文件中读取哈夫曼树频率

algorithm - 在分散的数据中寻找区域

java字符串排列组合查找

data-structures - 为什么要使用二叉搜索树?

data-structures - Heap 数据结构的准确定义是什么?

algorithm - 你如何证明一个序列的大θ是它的首项?

c++ - Union-Find leetcode 题目超时

git - 在 git 中,如果提交每个字符更改,大小会以什么速率增加?

生成随机数字字符串的算法,长度为 10,000 个字符?

MySQL:两次使用同一个表创建新表