在具有循环节点的复杂数据结构中查找最短路径

时间:2013-05-29 08:51:26

标签: python json traversal tree-traversal graph-traversal

以下是我在JSON中存储的数据结构示例:

{
    "alpha": {
        "node1": "echo",
        "node2": "bravo"
    },
    "bravo": {
        "node1": "alpha",
        "node2": "bravo",
        "node3": "charlie"
    },
    "charlie": {
        "node1": "bravo",
        "node2": "foxtrot"
    },
    "delta": {
        "node1": "alpha",
        "node2": "hotel"
    },
    "echo": {
        "node1": "golf",
        "node2": "delta"
    },
    "foxtrot": {
        "node1": "echo",
        "node2": "india",
        "node3": "delta"
    },
    "golf": {
        "node1": "hotel",
        "node2": "charlie"
    },
    "hotel": {
        "node1": "foxtrot",
        "node2": "india"
    },
    "india": {
        "node1": "charlie",
        "node2": "hotel"
    }
}

我希望找到任意两个节点之间的最短路径。例如,从echohotel的最短路径是:echo - > golf - > hotel

正如您所看到的,这些节点正在循环,并且可以无限地遍历它们。我还应该注意,节点路径都是单向的。因此,使用上面的相同示例,从hotel返回echo的最短路径是:hotel - > foxtrot - > echo

这样的数据结构有名称吗?我知道循环打破了“树”的规则。这会是图遍历吗?

2 个答案:

答案 0 :(得分:1)

你拥有的是adjacency list。虽然这样的东西更清晰(删除node1,node2使其成为一个简单的数组):

{
    "alpha": [
        "echo",
        "bravo"
    ],
    "bravo": [
        "alpha",
        "bravo",
        "charlie"
    ],
    ...
    "india": [
        "charlie",
        "hotel"
    ]
}

没有给出权重/距离,因此您可以找到BFS的最短路径。 Here是一种实现。

答案 1 :(得分:0)

您正在寻找的是通过图表的最短路径。看看这个:

http://networkx.github.io/documentation/latest/reference/algorithms.shortest_paths.html