Data structures 堆密钥复杂性

Data structures 堆密钥复杂性,data-structures,heap,complexity-theory,time-complexity,asymptotic-complexity,Data Structures,Heap,Complexity Theory,Time Complexity,Asymptotic Complexity,假设A是一个堆,其中不是以常规方式存储值,而是只定期存储根,每个子级存储为其与父级之间的差异。HEAP-INCREASE-KEY(A,i,KEY)操作的复杂性是什么(该操作将节点的KEY更新为KEY)?它可以在O(log N)时间内完成,就像在正常堆中一样。要查找要存储在节点i中的新值,可以遍历从堆的根到该节点的路径,以表示新键值与其父节点之间的差异。在这之后,筛选过程可以用与在正常堆中执行的几乎相同的方式来执行。执行交换入筛选过程时,仅会更改这两个交换节点及其子节点的值。因此,一次交换需要O(

假设A是一个堆,其中不是以常规方式存储值,而是只定期存储根,每个子级存储为其与父级之间的差异。HEAP-INCREASE-KEY(A,i,KEY)操作的复杂性是什么(该操作将节点的KEY更新为KEY)?

它可以在
O(log N)
时间内完成,就像在正常堆中一样。要查找要存储在节点
i
中的新值,可以遍历从堆的根到该节点的路径,以表示新
值与其父节点之间的差异。在这之后,筛选过程可以用与在正常堆中执行的几乎相同的方式来执行。执行交换入筛选过程时,仅会更改这两个交换节点及其子节点的值。因此,一次交换需要
O(1)
更新。这就是为什么总的时间复杂度是
O(logn)

下面是一个简单的实现方法:
1.如果一个节点位于堆的根和更新的节点之间的路径上,我们将其称为“toucted”。如果一个节点与最近的“接触”节点之间的距离最多为2,那么我们将其称为“重建”节点。
2.对于每个“重构”节点,可以通过遍历堆来计算其真实值。请注意,任何查询都有
O(logn)
“重建”节点。
3.重建所有“重建”节点的真实值后,可以运行通常的筛选过程。

4.此过程完成后,可以通过遍历所有“重建”节点的堆,根据节点与其父节点之间的差异计算密钥。所有其他节点都不会被触碰

key
是节点
i
处的值与父值之间的差值,还是节点
i
处的实际值之间的差值?该操作只能增加值还是差值为负值?这个问题在这里是边缘问题(离题但可以容忍);我建议在这里删除它,并将其发布在此处,因为它与主题密切相关,而且更容易被主题专家看到。这个问题似乎与主题无关,因为它与计算机科学有关,不是关于编程。你能解释一下在这种情况下是如何执行sift过程的吗?@Guy节点值和其父值之间的差异是已知的。所以很清楚它们是否应该被交换。当你说“他只改变这两个交换的节点及其子节点的值”时,有多少节点被改变了?“我不明白这部分内容。”伙计,我在回答中添加了更多细节。