Algorithm 在距离d处找到顶点
我有一棵有N个顶点的树。我想设计一个算法来快速回答一些问题。给定顶点V和整数d,我想找到距离V为d的顶点。如果距离d有多个顶点,则输出任意顶点。我显然知道如何使用暴力。我还尝试了一些类似于LCA查找算法的想法(计算距离为1、2、4、8的祖先),但没有任何结果Algorithm 在距离d处找到顶点,algorithm,graph-theory,Algorithm,Graph Theory,我有一棵有N个顶点的树。我想设计一个算法来快速回答一些问题。给定顶点V和整数d,我想找到距离V为d的顶点。如果距离d有多个顶点,则输出任意顶点。我显然知道如何使用暴力。我还尝试了一些类似于LCA查找算法的想法(计算距离为1、2、4、8的祖先),但没有任何结果 我会有很多问题,比如10^6,所以我想在O(1)或O(logn)时间内回答这些问题运行Floyd–Warshall算法,在图形中计算所有对之间的最短路径,然后使用这个? 也许从V开始,在深度d处停止的深度优先搜索就足够了,这取决于您打算执行
我会有很多问题,比如10^6,所以我想在O(1)或O(logn)时间内回答这些问题运行Floyd–Warshall算法,在图形中计算所有对之间的最短路径,然后使用这个?
也许从V开始,在深度d处停止的深度优先搜索就足够了,这取决于您打算执行的查询数量。在图形中运行Floyd–Warshall算法一次,计算所有对之间的最短路径,然后使用它?
也许从V开始,在深度d处停止的深度优先搜索就足够了,这取决于您打算执行的查询数量。这种方法可以工作
这可以通过使用持久的二进制搜索树从第4步开始预先计算深度数据结构在线实现,每次查询同样以O(logn)为单位
这可以通过使用持久二进制搜索树从步骤4开始预先计算深度数据结构在线实现,每次查询也使用O(log n)进行计算。为树的每一条边添加与子代数对应的权重。此操作只能执行一次,且为O(N) 如果只想在特定距离d处找到顶点,只要找到一根重量足够高的树枝,并达到d步,就可以通过简单地在树上走上走下,以O(d)步的方式找到顶点
如果您在同一棵树上执行多个查询,这将执行得非常好。为树的每个边添加一个与子体数量对应的权重。此操作只能执行一次,且为O(N) 如果只想在特定距离d处找到顶点,只要找到一根重量足够高的树枝,并达到d步,就可以通过简单地在树上走上走下,以O(d)步的方式找到顶点
如果您在同一棵树上执行许多查询,那么这将执行得非常好。在为给定节点构建图形/添加链接时 可以存储该顶点的边贴图,其中距离为关键点,该距离处的边为值。通过这种方式,您可以在O(1)中构建和检索
类顶点{
字符串顶点标签;
为给定节点构建图形/添加链接时映射
可以存储该顶点的边映射,其中距离为关键点,该距离处的边为值
类顶点{
字符串顶点标签;
MapIt是一种蛮力算法,我要寻找的是O(n)或O(n log n)深度优先搜索将是O(n)(可能较少取决于d),因为所有顶点最多访问一次。这是一种蛮力算法,我要寻找的是O(n)或O(n log n)深度优先搜索将是O(n)(可能较少取决于d),因为所有顶点最多只能访问一次。要在给定距离内找到一个点,只需在所有点上循环并测试它们。对于更复杂的查询,如k-最近点和类似的查询,请使用kd树、范围树或任何其他类似的数据结构。为什么类似LCA的解决方案不起作用?因为它计算到祖先的距离,但不计算到祖先的距离场景。您希望顶点与根之间有任何路径d
边,还是希望最小距离为d
?例如,如果存在路径a->b->c->d->e->f->g
和a->g
,那么顶点g
与顶点a
之间的距离是6
,还是只是一个距离对于1
(或者两者都是距离)?@MT0在树中,顶点之间的(简单)路径是唯一的。因此不会发生这种情况。要在给定距离内找到一个点,只需在所有点上循环并测试它们。对于更复杂的查询,如k-最近点和类似的查询,请使用kd树、范围树或任何其他类似的数据结构
class Vertex{
String vertexLabel;
Map<Integer,List<Edge> edgeMap;
}