我编写了一个存储优先级的二进制堆(私有成员是PRIORITY和KEY)。我想知道当给出变量KEY时,如何在低于O(n)复杂度的情况下改变堆元素的优先级。提前谢谢
答案 0 :(得分:4)
解决这个问题的一种方法是使用另一种结构(我称之为辅助数据结构)。例如,将键映射到二进制堆中的元素的散列映射(例如,unordered_map)。您可以使用此数据结构来查找堆中哪个元素需要修改其优先级。修改元素的优先级后,需要对其执行一次sink
和一次sift
操作。这两个操作都具有复杂性O(log(n))
,因此总体而言,优先级的修改具有复杂性O(log(n))
。这里我假设你使用一个辅助数据结构,它支持按键复制,复杂度不超过O(log(n))
(如果是哈希映射,复杂度为O(1))。
请注意,您必须修改已为二进制堆实现的操作,以使辅助数据结构与二进制堆保持同步。