我试图找到有关此特定用途的信息,但我不能。
在模拟软件(就像视频游戏一样)中,我建立了一个事件管理器,根据事件创建者提交的值对事件进行优先级排序。事件队列将每帧解析一次,并且将处理其中的所有事件,因此每个新帧以空队列开始。
现在我有两个选项来存储事件并优先考虑它们:
由于我每帧只解析一次事件列表,因此我不需要 以确保其始终具有优先级。
我的问题是:在这种情况下,make_heap是否比让容器始终保持最新状态更有效?或者它取决于我管理的数据量?还是我在思考它?
答案 0 :(得分:2)
渐近地没有区别:
在有序集合中插入N次是O(N log N)。
对N个元素的无序集合进行排序为O(N log N)。
因此,选择最快解决方案的最佳方法是实现两者并检查实际数据。
我认为将事件存储在std::vector
等容器中并在最后对它们进行排序会更快,因为快速添加帧准备不会使CPU缓存失效,这可能发生在" long&#34期间;和非平凡的O(log N)插入std::priority_queue
或std::map
。
同样将事件存储在简单容器(std::vector
)中并在需要时处理它们(排序等)对我来说更符合逻辑。
答案 1 :(得分:1)
保持队列优先级始终需要Θ(n log n)
时间。使堆需要Θ(n)
时间。之后,两种方法都需要相同的时间Θ(n log n)
,以排序的顺序逐个提取元素。所以make_heap
显然是更好的选择。但是,由于这两种方法在需要时等同于对输入进行排序,因此quicksort
是更好的选择。
答案 2 :(得分:0)
std::map<priority, event>
可能是一种权衡:根据优先级进行插入。 std::map
的插入是或n log(n)
命令,并始终保持优先顺序。
在需要事件时,不需要任何处理,只需迭代。