我需要一个容器来存储对,我有两个操作:
>按键更新值
>获得具有最大价值的密钥.
对于第一个操作,map是一个很好的结构.对于第二个操作,似乎优先级队列是一个很好的.你会怎么做?无论如何在没有O(n)循环的情况下完成两个操作?
谢谢.
解决方法
对此渐近有效的解决方案是使用散列表和Fibonacci堆的组合.您可以使用哈希表在O(1)时间内访问与任何特定键相关联的值,并使用Fibonacci堆能够快速查找具有最低值的键/值对(这样做)在O(1)).
如果要更改与键关联的值,如果要增加该值,则可以通过在Fibonacci堆上使用增量键操作(缓冲)O(1)时间来执行此操作,该操作具有O(1)摊还时间.如果要减小该值,则需要O(log n)时间从Fibonacci堆中删除该元素,然后重新插入.
总的来说,这给出了时间复杂度
>插入一个新元素: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)时间.
希望这可以帮助!