提高树“查询”的效率

问题描述

我已经分配了一个关于在通用树上执行某些查询的任务。输入是一个无向连通图,有 N 个节点和 N-1 个弧(基本上是一个树),每个都有一定的成本,目标是回答关于这个结构的 Q 查询。 每个查询都包含图的附加弧(具有给定的成本),并且只有当图中存在可以用它替代的弧(具有更高或相等的成本)时,特定查询的答案才为“是”,保持其中的连通性。
现在,我提出的解决方案使用 DFS 在查询中包含的弧的两端之间的图中找到一条路径:如果这条路径包含更高(或相等)的成本弧,那么答案是是的,否则为否。
所以每个查询都是 O(N),但我需要大幅改进它:我一直在尝试使用内存以某种方式使用先前查询的结果,但到目前为止没有任何效果。你有什么建议?

解决方法

我认为使用不同的数据结构 (max heap) 来存储所有弧会将查询的时间复杂度降低到 O(1) 和替换和恢复最大堆的时间复杂度为 O(logn)(维护堆).

您的新步骤可以是:

  1. 在初始化期间,遍历树(图),并将所有弧保存在最大堆中。时间复杂度为 O(n),因为您必须迭代所有节点。但由于是初始化,所以成本是一次性的。
  2. 在查询过程中,只需检查输入的最大值 堆,时间复杂度为 O(1)。
  3. 如果输入成本大于堆中的最大值,那么您只需返回 NO。 否则,您可以返回YES,并用输入弧替换最大节点,并恢复最大堆。最坏情况下的时间复杂度为 O(logn)。