【问题标题】:HEAP-INCREASE-KEY complexityHEAP-INCREASE-KEY 复杂度
【发布时间】:2014-11-08 16:35:52
【问题描述】:

让 A 成为一个堆,其中不是以常规方式存储值,而是仅定期存储根,并且每个子都存储为其与其父之间的差异。 HEAP-INCREASE-KEY(A, i, key) 操作的复杂度是多少(该操作将i处节点的key更新为key)?

【问题讨论】:

  • key 是节点i 的值与父值之间的差异,还是节点i 的实际值?操作只能增加值还是差值可以为负?这个问题在这里是临界的(离题但可以容忍);我建议在此处将其删除,然后将其发布到 Computer Science,因为它与主题密切相关,更有可能被主题专家看到。
  • 这个问题似乎跑题了,因为它是关于计算机科学的,而不是关于编程的。

标签: data-structures heap complexity-theory time-complexity asymptotic-complexity


【解决方案1】:

它可以像在普通堆中一样在O(log N) 时间内完成。要找到一个新值来存储在节点i 中,您可以遍历从堆的根到该节点的路径,以根据它与其父节点之间的差异来表达一个新的key 值。之后,可以以与在普通堆中完成的方式几乎相同的方式执行筛选过程。当执行筛选过程中的交换时,仅这两个交换节点及其子节点的值会发生变化。因此,一次交换需要O(1) 更新。这就是总时间复杂度为O(log N)的原因。

这是一个简单的实现方法:
1. 如果一个节点位于堆的根节点和更新节点之间的路径上,我们就称它为“触及”节点。如果一个节点与最近的“接触”节点之间的距离最多为 2,我们就称它为“重构”节点。
2. 对于每个“重构”节点,可以通过遍历堆计算其真实值。请注意,任何查询都有O(log N)“重构”节点。
3. 重建所有“重建”节点的真实值后,可以运行通常的筛选程序。
4. 此过程完成后,可以通过遍历所有“重构”节点的堆,根据节点与其父节点之间的差异来计算密钥。所有其他节点都不会被触及。

【讨论】:

  • 您能解释一下在这种情况下如何执行筛选过程吗?
  • @Guy 节点值与其父值之间的差异是已知的。所以很清楚是否应该交换它们。
  • 当您说“他的值仅针对这两个交换的节点及其子节点发生变化”时,有多少节点发生了变化?我不明白这部分。
  • @Guy 我已经为我的答案添加了更多细节。
猜你喜欢
  • 2015-09-21
  • 2018-04-15
  • 2016-02-13
  • 2021-04-22
  • 2012-08-14
  • 2018-04-05
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多