algorithm - 在非循环有向图中查找两个节点之间所有路径的有效方法

标签 algorithm data-structures graph network-programming julia

我想找到图中两个节点之间的所有路径。我编写了一个递归函数,它借助深度优先搜索算法找到所有路径。但是对于更大的图,它的效率非常低,所以我不能将它用于我的程序。

我正在考虑为我的问题实现迭代方法。这对我来说会非常耗时。那么有人知道这是否有意义吗?

在这种情况下,迭代方式是否更有效?或者是否可以优化我的递归方法?

我当前的功能:

function RecDFS(g::GenericGraph, visited)
    nodes = out_neighbors(visited[length(visited)], g) 

    for i in nodes
    if in(i,visited)
        continue
    end

    if i.label == "End"
        push!(visited,i)
        println(visited) # print every path from the first node in visited to the node with the label End
        pop!(visited)
        break
    end

    # continue recursive..
    for i in nodes
        if (in(i, visited) || i.label == "End")
            continue
        end
        push!(visited,i)
        depthFirstSearchAllI(g, visited)
        pop!(visited)
    end
end

最佳答案

您要解决的问题实际上是一个 NP-hard 问题,这意味着它还没有多项式时间算法!

所以你也许可以找到一些优化你的问题,但你不能让它运行得足够快!

与优化一样,您可以执行以下操作。首先,您在问题主题中提到您的输入是 DAG 图,根据定义,DAG 具有以下属性:

DAG 的两个不同连接部分的两个节点之间没有路径。

因此,如果您有一个列表,其中列出了哪些节点位于 DAG 的哪个连接部分(这可以在多项式时间内实现),您可以轻松地划掉很多无望的组合。

在使您的程序迭代时,您可以轻松地使用堆栈来代替。只需将每个递归调用替换为 stack.push(node) 并将代码的遍历部分放入一段时间内(堆栈不为空),然后将节点一个接一个地弹出,除非没有节点。应该这样做。

关于algorithm - 在非循环有向图中查找两个节点之间所有路径的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30646710/

相关文章:

数组中的Java匹配模式

c++ - 实现一个递归的Void函数(求二叉搜索树的高度)

c++ - 合并 2 个不同的 AVL 树

将文档中属于同一部分的部分分组的算法

r - 如何使用 r 编程语言处理数据集列中包含的空值?

algorithm - 汉密尔顿路径和欧拉路径的区别

function - 完美的哈希函数

python - 在 python 中对列表进行分箱

data-structures - 最小生成树 : What exactly is the Cut Property?

使用同步滤波器对图像进行抗锯齿的算法