C++优先级队列-根据更新的优先级重新排序
C++ Priority Queue - Reorder based on updated priorities
一些背景:我正在构建一个C++
线程管理器,它允许用户创建AsyncJob
对象并分配执行优先级。我有一个JobManager
单例类,它管理这些AsyncJobs
的优先级队列,并在可用时将它们分配给线程。
问题:用户需要能够修改优先级AFTER
的创建。例如,根据一些运行时事件,可能需要比其他文件更紧急地加载文件。我面临的问题是,当调用push()
或pop()
时,优先级队列只对内部堆上的元素进行重新排序。据我所知,没有一个公开的接口允许人们根据不断变化的优先级请求重新排序。
我想做的是这样的事情:
- 在我的
JobManager
类中创建一个hashmap
,该类包含指向优先级队列中对象的指针 - 用户可以通过其密钥访问请求的作业,并通过哈希图更新优先级
JobManager
然后向优先级队列发出优先级已更改的信号- 优先级队列内部重新排序
最好的办法是什么?我应该创建自己的自定义优先级队列类吗?或者可能从std::priority_queue
扩展?
谢谢!
一个选项可以允许您的AsyncJob处于"已取消"状态,只需在取消旧的优先级后,每次修改优先级时向PQ添加一个新的(副本(AsyncJob即可。
和许多事情一样,我认为"最佳方式"是高度主观的,因为它取决于你的约束程度,以及你如何量化"最佳"。就我个人而言,如果可能的话,我喜欢避免从标准库类型派生和重新发明容器结构。
二进制搜索树似乎是一个不错的选择。
二进制搜索树应该按优先级排序,其次,如果优先级不是唯一的,则应该按对象中的唯一标识符/标识符集排序。
如果你不知道以前的优先级,当你想更改它时,你需要一种方法来查找它——也许是一个对象到优先级的哈希表。
这允许您删除并重新插入O(log n)
中的特定项,而不会丢失其他操作的O(log n)
性能(以及O(1)
以获得第一个(。
对于C++:
如果优先级是唯一的,则对对象具有优先级的map
可以工作,否则是set
<
pair
>
,其中对中的第一个元素是优先级,第二个元素是对象(是的,我知道,这些不一定是BST(。
对于哈希表,可以使用对象到优先级的unordered_map
,或者简单地使用C++11之前的map
。
删除更改优先级的项,然后添加它(或者添加一个副本,如果新优先级在逻辑上意味着新项(可能是最简单的方法。毕竟,您不想从头开始对整个队列进行重新排序,只需对单个更改的项进行删除和插入即可。
编辑:然而,正如Paul Renton所提到的,std::priority_queue
不允许在没有poppinh头部的情况下获得单个项目,所以我会从默认使用std::vector
的std::priority_queue
中获得灵感,使用std::vector
滚动我自己的优先级队列。我将仅公开我需要的内容,而不是std::priority_queue
的整个API集合。我不允许使用整个列表,而是允许删除和插入按优先级正确排序的项目。
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 更改运行时优先级队列的排序功能
- 优先级队列未正确排序
- 排序函数和优先级队列 C++ 中的比较器
- C++ 中优先级队列的结构排序条件
- 如何按姓氏排序并打印新数组
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 相同的比较功能为C++中的排序和优先级队列提供不同的输出
- 合并排序 - 返回新数组,而不是将合并的数组复制到输入数组
- 根据优先级对向量列表进行字典式排序
- 使用冒泡排序c++对结构数组的成员进行优先级排序
- 如何对骰子进行排序并创建每个数组中具有相等骰子的新数组,Yahtzee,C++
- 如何将未排序数组的排序索引放入新数组中
- 为线程设置新优先级时不允许操作
- 为什么函数比较器不像在排序中那样在优先级队列中工作?
- 为什么我的基本优先级队列排序算法会导致 seg 错误
- 创建没有重复项的新排序向量
- C++优先级队列-根据更新的优先级重新排序
- 优先级队列排序指针指向改变值的对象.c++