c++ - 当我们可以更有效地使用向量来实现优先级队列时,为什么使用堆来实现它
问题描述
为什么在不使用堆的priority_queue
情况下使用堆来实现我们可以只用向量来实现它。
假设我们使用向量作为队列并保持元素降序。我们可以将其用作优先队列。
对于插入:我们可以使用二分查找。Complexity O(logN)
删除:这里我们也可以使用二分查找。Complexity O(logN)
对于顶部元素:O(1)
此外,我们可以在O(1)
短时间内访问第 k 个最大元素,而堆则不然。
那么,我们为什么要使用堆来实现优先级队列呢?
解决方案
对于插入:我们可以使用二分查找。复杂度 O(logN)
对于 deltion :这里我们也可以使用二进制搜索。复杂度 O(logN)
不,你不能。通过使用排序的数组/向量,您只能搜索正确的索引,O(log N)
但要执行实际的插入或删除,您必须移动其他元素,即O(N)
.
推荐阅读
- c++ - 如何在 C++ 中使用关键字 delete 删除特定模板特化
- cakephp - Cakephp 包含在另一个里面。这是可能的?
- c++ - 函数模板如何推断 initializer_list 嵌套的次数?
- visual-studio - 无法安装 Microsoft.VisualStudio.Community.Msi
- mongodb - 如何相互比较嵌套数组元素并计算子文档总数?
- plsql - 如何根据 PL/SQL 中 BRITISH/COMMONWEALTH LANGUAGE 的约定将 AMOUNT 拼写成 WORDS
- arrays - 如何将 numpy 数组的类型从字符串更改为布尔值?
- asn1 - ASN1 全局约束
- api - 使用 RestSharp 的 API 测试不断返回“未经授权的访问,无效的 API 密钥”
- regex - 使用正则表达式 tr 或 awk 过滤 bash 脚本中的变量