每帧需要一次make_heap vs priority_queue效率

时间:2015-03-09 18:46:31

标签: c++ sorting std

我试图找到有关此特定用途的信息,但我不能。

在模拟软件(就像视频游戏一样)中,我建立了一个事件管理器,根据事件创建者提交的值对事件进行优先级排序。事件队列将每帧解析一次,并且将处理其中的所有事件,因此每个新帧以空队列开始。

现在我有两个选项来存储事件并优先考虑它们:

  1. 使用std :: priority_queue,它将始终保持列表/向量/容器的优先级,然后在它的时间内解析它;
  2. 使用非优先级容器,当我需要解析它时,请在之前调用make_heap,以便使事件优先。
  3. 由于我每帧只解析一次事件列表,因此我不需要 以确保其始终具有优先级。

    我的问题是:在这种情况下,make_heap是否比让容器始终保持最新状态更有效?或者它取决于我管理的数据量?还是我在思考它?

3 个答案:

答案 0 :(得分:2)

渐近地没有区别:

  1. 在有序集合中插入N次是O(N log N)。

  2. 对N个元素的无序集合进行排序为O(N log N)。

  3. 因此,选择最快解决方案的最佳方法是实现两者并检查实际数据。

    我认为将事件存储在std::vector等容器中并在最后对它们进行排序会更快,因为快速添加帧准备不会使CPU缓存失效,这可能发生在" long&#34期间;和非平凡的O(log N)插入std::priority_queuestd::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)命令,并始终保持优先顺序。

在需要事件时,不需要任何处理,只需迭代。