让A成为一个堆,而不是以常规方式存储值,只定期存储根,并将每个子存储为它与其父节点之间的差异。 HEAP-INCREASE-KEY(A,i,key)操作的复杂性是什么(操作将i的节点密钥更新为密钥)?
答案 0 :(得分:1)
它可以在O(log N)
时间内完成,就像在普通堆中一样。要查找要存储在节点i
中的新值,您可以遍历从堆根到此节点的路径,以根据它与其父节点之间的差异来表示新的key
值。之后,可以以与在普通堆中完成相同的方式执行筛选过程。执行sift-up过程中的交换时,值仅对这两个交换节点及其子节点进行更改。因此,一次交换需要O(1)
次更新。这就是为什么总时间复杂度为O(log N)
。
这是一种实现它的简单方法:
1.让我们呼叫节点"触摸"如果它位于堆根和更新节点之间的路径上。让我们调用节点"重建"如果它与最近的"触及的距离是什么?节点最多为2
2.对于每个"重建"节点一可以通过遍历堆来计算其真值。请注意,有O(log N)
"重建"任何查询的节点
3.重建所有重建的真实价值后重建"节点可以运行通常的筛选程序
4.在此过程完成之后,可以通过遍历所有“重建”的堆来计算节点与其父节点之间差异的密钥。节点。永远不会触及所有其他节点。