在O(log(n))复杂度中改变二进制堆元素的优先级

时间:2015-01-07 14:16:16

标签: c++ algorithm data-structures heap time-complexity

我编写了一个存储优先级的二进制堆(私有成员是PRIORITY和KEY)。我想知道当给出变量KEY时,如何在低于O(n)复杂度的情况下改变堆元素的优先级。提前谢谢

1 个答案:

答案 0 :(得分:4)

解决这个问题的一种方法是使用另一种结构(我称之为辅助数据结构)。例如,将键映射到二进制堆中的元素的散列映射(例如,unordered_map)。您可以使用此数据结构来查找堆中哪个元素需要修改其优先级。修改元素的优先级后,需要对其执行一次sink和一次sift操作。这两个操作都具有复杂性O(log(n)),因此总体而言,优先级的修改具有复杂性O(log(n))。这里我假设你使用一个辅助数据结构,它支持按键复制,复杂度不超过O(log(n))(如果是哈希映射,复杂度为O(1))。

请注意,您必须修改已为二进制堆实现的操作,以使辅助数据结构与二进制堆保持同步。