C++优先级字典

use*_*367 7 c++ stl map data-structures

我需要一个容器来存储对,我有两个操作:

  1. 按键更新值
  2. 获得具有最大价值的密钥.

对于第一个操作,map是一个很好的结构.对于第二个操作,似乎优先队列是一个好的队列.你会怎么做?无论如何在没有O(n)循环的情况下完成两个操作?谢谢.

tem*_*def 7

对此渐近有效的解决方案是使用散列表和Fibonacci堆的组合.您可以使用哈希表在O(1)时间内访问与任何特定键相关联的值,并使用Fibonacci堆能够快速查找具有最低值的键/值对(这样做)在O(1)).

如果要更改与键关联的值,如果要增加该值,则可以在(摊销)O(1)时间内使用Fibonacci堆上的增量键操作来执行此操作,该操作具有O(1)摊销时间.如果您减少该值,它会采取O(log n)的时间来删除的元素出来的斐波那契堆,然后重新插入.

总的来说,这给出了时间复杂度

  • 插入一个新元素:O(1)表示散列,O(1)表示插入Fibonacci堆:O(1)时间.
  • 删除元素:O(1)表示散列,O(log n)表示从Fibonacci堆中删除:O(log n)时间.
  • 查找顶部元素:在Fibonacci堆中查找O(1):O(1)时间.
  • 增加一个值:散列为O(1),增加键为O(1):O(1)时间.
  • 减小值:散列为O(1),删除/插入为O(log n):O(log n)时间.

希望这可以帮助!