我知道从堆中删除节点是O(log n)
在根节点发生的。而且我也知道在其中一个堆树问题中删除堆中的任意节点并且是O(n)
。
是否有任何算法可以减少将 Ith 节点从maxheap删除到O(log n)
的运行时间,其中<em> I 的范围是1到N?
答案 0 :(得分:4)
从堆中删除任意节点的昂贵部分不在删除中,而在于查找要删除的节点。实际上删除节点是O(log n)。但首先,您必须对基础数据存储执行顺序扫描才能找到节点。这是O(n)部分。
加快这一速度的唯一方法是保留第二个数据结构,如字典或哈希映射或类似的,可以快速告诉您项目在后备存储中的位置。然后你在字典中进行O(1)查找,从字典中删除O(1),从堆中删除O(log n)。