c++ - 构建堆的时间复杂度
问题描述
我试图了解 C++ STL priority_queue 用于构建堆的时间复杂度。对于构建堆,时间复杂度应为 O(n)。假设我们有一个包含 n 个元素的向量,并且我们想从该向量构建一个最大堆。代码将是这样的 -
vector<int> vec{3,4,5,1,2};
priority_queue<int> pq;
for (auto v : vec) {
pq.push(v);
}
推送操作需要 O(log n) 时间。在我看来,它是 O(nlogn) 时间复杂度。但是上面的代码片段只是第一次从向量中构建了一个堆。对于上述情况,即构建堆,复杂性如何为 O(n)。
编辑:如果上面的代码片段是 O(nlogn),那么我想知道在 O(n) 中使用 priority_queue c++ stl 构建堆的代码。
解决方案
考虑这个用于构建输入数组 A 的堆的算法。
BUILD-HEAP(A)
heapsize := size(A);
for i := floor(heapsize/2) downto 1
do HEAPIFY(A, i);
end for
END
这个上限O(nlg(n))
虽然是正确的,但不是渐近紧的。
我们可以通过观察 Heapify 的运行时间取决于树 'h' 的高度(等于 lg(n),其中 n 是节点数)和大多数子树的高度来得出更严格的界限小的。
我们可以通过观察 Heapify 的运行时间取决于树 'h' 的高度(等于 lg(n),其中 n 是节点数)和大多数子树的高度来得出更严格的界限小的。
请参阅此链接,以获得完整的解释和数学证明。
推荐阅读
- security - 你将如何在不使用 nginx.conf 的情况下阻止来自不受信任的 IP 的 Drupal 管理员登录页面的访问?
- java - android studio 中的 Flight Passanger 详细信息
- c++ - Visual Studio 的 LNK2019 错误 - 未解析的外部符号
- html - Safari 不能正确渲染 px 值?
- javascript - JavaScript / jQuery:将项目推送到数组/对象,每个项目具有相同的键
- python - groupby 值的计数不等于其他 col 值 pandas
- javascript - 当我在 React Native 中下载已上传到 Google Drive 的文件时,我得到的文件大小与原始文件不同
- flutter - Google Play 发布前报告
- bash - 在 bash shell -E 选项解释中,“子shell环境继承的任何陷阱”是什么意思?
- python - 从python中的列表中删除中间成员或成员