更新已排序数据结构中的单个值

时间:2011-01-19 14:19:25

标签: c++ algorithm data-structures

我需要一个能够:

的数据结构
  1. 添加一个值
  2. 获得最低价值
  3. 更新一个值
  4. 我可以使用std::multiset实现此目的,其中操作被简化为:

    1. multiset::insert()
    2. multiset::begin()
    3. 首先使用multiset::erase()删除该项目,然后使用multiset::insert()
    4. 添加更新的项目

      我不喜欢multiset的一件事是需要迭代器来更新项目。如果指针足够的话会很好。

      我想知道使用std::priority_queue,std堆算法或其他任何操作所需的操作以及如何操作会更好。对于std::priority_queue或堆算法,前两个操作很简单,但第三个操作(更新)是个问题。还有其他可以使用的结构吗?与multiset相比,它们的性能优势是什么?

2 个答案:

答案 0 :(得分:2)

std::priority_queue将为您提供高效的插入和最低价值的查询,但更新速度会很慢。您可以通过在PQ和std::vector中存储指针并使用向量执行更新来提高更新效率。要执行更新,请将条目标记为陈旧并插入新的更新副本。然后在查询最低值时,忽略陈旧条目。

答案 1 :(得分:1)

看起来multiset应该具备您需要的良好特征。

您需要考虑哪些操作需要最快。如果更新相对较少,priority_queue可能会更好。如果您使用priority_queue一个选项使update更快,只需将旧项目标记为无效(假设您有一个引用/指针)并添加新项目+ reheapify。然后当你拉下最低的项目时,首先要确保它在使用之前没有被标记为无效(否则获得下一个最低的项目)。只要从容器中移除项目有点昂贵,这种技术就很有用。