Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在距离d处找到顶点_Algorithm_Graph Theory - Fatal编程技术网

Algorithm 在距离d处找到顶点

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处停止的深度优先搜索就足够了,这取决于您打算执行

我有一棵有N个顶点的树。我想设计一个算法来快速回答一些问题。给定顶点V和整数d,我想找到距离V为d的顶点。如果距离d有多个顶点,则输出任意顶点。我显然知道如何使用暴力。我还尝试了一些类似于LCA查找算法的想法(计算距离为1、2、4、8的祖先),但没有任何结果


我会有很多问题,比如10^6,所以我想在O(1)或O(logn)时间内回答这些问题

运行Floyd–Warshall算法,在图形中计算所有对之间的最短路径,然后使用这个?
也许从V开始,在深度d处停止的深度优先搜索就足够了,这取决于您打算执行的查询数量。

在图形中运行Floyd–Warshall算法一次,计算所有对之间的最短路径,然后使用它?
也许从V开始,在深度d处停止的深度优先搜索就足够了,这取决于您打算执行的查询数量。

这种方法可以工作

  • 计算树中最长路径的质心。为此,使用深度优先搜索查找顶点x,其中以x为根的树中顶点深度的最大值最小
  • 使用简单的树遍历计算以x为根的树中所有顶点的深度
  • 根据连接组件的索引对查询进行分组,如果删除x,则查询将归入该组件
  • 按组件迭代所有查询。假设您的查询是(v,d)。如果深度(v)=d,则由于x的特性,存在一条从v开始的长度为d的路径,该路径穿过x

    可以使用单个深度优先搜索来实现步骤1和2

    对于步骤4,您希望保留一个哈希表,该哈希表将深度与顶点相关联,可以在O(1)中删除和添加顶点。然后,当您逐个组件工作时,可以在线性时间内执行此操作

    总运行时间为O((n+q)*对数n)


    这可以通过使用持久的二进制搜索树从第4步开始预先计算深度数据结构在线实现,每次查询同样以O(logn)为单位

  • 计算树中最长路径的质心。为此,使用深度优先搜索查找顶点x,其中以x为根的树中顶点深度的最大值最小
  • 使用简单的树遍历计算以x为根的树中所有顶点的深度
  • 根据连接组件的索引对查询进行分组,如果删除x,则查询将归入该组件
  • 按组件迭代所有查询。假设您的查询是(v,d)。如果深度(v)=d,则由于x的特性,存在一条从v开始的长度为d的路径,该路径穿过x

    可以使用单个深度优先搜索来实现步骤1和2

    对于步骤4,您希望保留一个哈希表,该哈希表将深度与顶点相关联,可以在O(1)中删除和添加顶点。然后,当您逐个组件工作时,可以在线性时间内执行此操作

    总运行时间为O((n+q)*对数n)


    这可以通过使用持久二进制搜索树从步骤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;
    }