我需要一个能够:
的数据结构我可以使用std::multiset
实现此目的,其中操作被简化为:
multiset::insert()
multiset::begin()
multiset::erase()
删除该项目,然后使用multiset::insert()
我不喜欢multiset
的一件事是需要迭代器来更新项目。如果指针足够的话会很好。
我想知道使用std::priority_queue
,std堆算法或其他任何操作所需的操作以及如何操作会更好。对于std::priority_queue
或堆算法,前两个操作很简单,但第三个操作(更新)是个问题。还有其他可以使用的结构吗?与multiset
相比,它们的性能优势是什么?
答案 0 :(得分:2)
std::priority_queue
将为您提供高效的插入和最低价值的查询,但更新速度会很慢。您可以通过在PQ和std::vector
中存储指针并使用向量执行更新来提高更新效率。要执行更新,请将条目标记为陈旧并插入新的更新副本。然后在查询最低值时,忽略陈旧条目。
答案 1 :(得分:1)
看起来multiset
应该具备您需要的良好特征。
您需要考虑哪些操作需要最快。如果更新相对较少,priority_queue
可能会更好。如果您使用priority_queue
一个选项使update
更快,只需将旧项目标记为无效(假设您有一个引用/指针)并添加新项目+ reheapify。然后当你拉下最低的项目时,首先要确保它在使用之前没有被标记为无效(否则获得下一个最低的项目)。只要从容器中移除项目有点昂贵,这种技术就很有用。