Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/13.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 从源到接收器的行走次数(精确为h跳)_Algorithm_Graph_Big O_Breadth First Search - Fatal编程技术网

Algorithm 从源到接收器的行走次数(精确为h跳)

Algorithm 从源到接收器的行走次数(精确为h跳),algorithm,graph,big-o,breadth-first-search,Algorithm,Graph,Big O,Breadth First Search,给定一个无向图,一个起始顶点和结束顶点。找到从源到汇的行走次数(因此顶点可以多次访问),这些行走次数恰好涉及h跳。例如,如果图是三角形,则具有h跳数的路径数由h-th给出。这可以扩展到一个完全连通的k节点图,从而产生递归(和闭式解) 当图形为n边多边形时,可接受的答案将行走次数表示为二项式项之和 我想对于任何给定的图,可能有一个有效的算法来找到这个数?我们可以假设图是在邻接矩阵、邻接列表或任何其他方便的符号中提供的。您可以制作一个算法,不断搜索所有可能的路径,但使用一个包含跳数的变量 对于每个可

给定一个无向图,一个起始顶点和结束顶点。找到从源到汇的行走次数(因此顶点可以多次访问),这些行走次数恰好涉及h跳。例如,如果图是三角形,则具有h跳数的路径数由h-th给出。这可以扩展到一个完全连通的k节点图,从而产生递归(和闭式解)

当图形为n边多边形时,可接受的答案将行走次数表示为二项式项之和


我想对于任何给定的图,可能有一个有效的算法来找到这个数?我们可以假设图是在邻接矩阵、邻接列表或任何其他方便的符号中提供的。

您可以制作一个算法,不断搜索所有可能的路径,但使用一个包含跳数的变量


对于每个可能的路径,每个跃点都将减少该变量,当到达零时,您的算法将尝试另一条路径,如果路径在使变量达到零之前到达目标,此路径将添加到所需路径的列表中

如果获取图形的邻接矩阵并将其提高到n次方,则生成的矩阵将计算从每个节点到另一个节点的路径数,这些路径正好使用n条边。这将提供一种计算您想要的数字的方法——加上许多其他您不太感兴趣的数字。:-)

假设路径的数量是“小的”(例如,适合64位整数的部分),您可以使用计算总成本为O(|V |ωlogn)的矩阵乘以O(logn),其中ω是矩阵的指数。然而,如果你要寻找的数量不适合机器字,那么这种方法的成本将取决于答案的大小,因为倍数将花费不同的时间。对于大多数图和较小的n,这不会是一个问题,但是如果n较大,并且图的其他部分紧密连接,这将稍微减慢速度


希望这有帮助

解决方案是使用修改后的BFS,该BFS具有两个交替队列和一个每个节点计数器,用于特定长度的该节点路径:

paths(start, end, n):
    q = set(start)
    q_next = set()
    path_ct = map()
    path_ct_next = map()

    path_ct[start] = 1

    for i in [0, n):  # counting loop
        for node in q:  # queue loop
            for a in adjacent(node):  # neighbor-loop
                path_ct_next[a] += path_ct[node]
                q_next.add(a)

        q = q_next
        q_next = set()

        path_ct = path_ct_next
        path_ct_next = map()

   return path_ct_next[end]

这里的基本假设是,
map()
生成一个字典,如果条目还不存在,它将返回零。否则,它将返回先前设置的值。计数循环只需根据需要进行尽可能多的迭代。队列循环在使用
i
跳数可以到达的所有节点上进行迭代。在邻居循环中,最终找到了在
i+1
跳中可以到达的所有节点。在这个循环中,相邻节点将被存储到一个队列中,用于计数循环的下一次迭代。到达此类节点的可能路径数是到达其前导节点的路径数之和。对当前计数循环迭代的每个节点执行此操作后,队列和表将被空实例交换/替换,算法可以重新开始。

那么,像深度优先搜索一样?我们如何知道何时停止?它将测试所有可能的路径,因此当它们完成时它将停止,这是您的问题吗?我认为您希望在计数器为零时访问目标节点。而且,我相信这需要指数级的时间,所以,不实用。哇,谢谢。我不知道邻接矩阵的幂属性。好像是为这个问题而做的。你有证据的链接吗?我没有现成的证据,但这里有一个归纳论点的速写。设A为图的邻接矩阵。矩阵A^0是单位矩阵,表示从每个节点到自身有一条长度为零的路径。现在假设A^k计算从每个节点到另一个节点的长度正好为k的路径数。现在考虑A^{k+1}=A^kA,并查看位置(i,j)处的条目。这是A^k的第i行和A^k的第j列的乘积。A^k的第i行统计从节点i到其他每个节点的长度为k的路径。A的第j列计算从每个节点到节点j的长度为1…的路径。因此,这计算了从i到k跳中的某个节点x,然后在一个跳中从x到j的方式,在所有节点k上求和。这是长度为k+1的从i到j的路径数。这是正确的,但使用正确的术语会有好处。它应该被称为walks(可以访问同一个节点),而不是path(路径中没有重复的节点)!你认为在这里添加logn算法的细节有用吗?我没有在其他问题上找到它(我可能会错过它),这个问题可能是关于图中行走次数的标准问题和答案。你能澄清一下你是在寻找路径的数量还是行走的数量吗?在路径中,节点不能访问两次。在漫游中,可以多次访问同一节点。提到Jakobstahl数字表明你想要散步而不是小路。是的,我在找散步。编辑了问题。这可能成为图表中行走次数的标准问题。我很惊讶以前没有人问过这个问题。OP刚刚澄清他们想要的是步行而不是小路。在这种情况下,这种方法会太贵。@为什么太贵?我们在
O(n*| V |)
。你将很难打破这个界限。但是我刚刚注意到这个算法是用于行走的,而不是路径,因为我忘了添加一个访问检查。嗯,我想我在发表这个评论时把自己弄糊涂了。道歉。但是,请注意,复杂度为
O(n | V |^2)
,因为邻居的数量(在执行邻居循环时)可能高达n。因此,您的答案适用于较低的n(约1mio?)但较高的V(约10k节点),而另一个答案适用于较高的n(数十亿)但略低的V(2k),