表示图的数据结构

时间:2019-03-27 12:32:30

标签: algorithm graph

有几个城市及其位置,我想创建一个数据结构来表示这样的图形。该图代表了仅一次访问每个城市即可采取的所有可能路径:

graph

我的问题是,由于这可能是一个非常普遍的问题,是否存在一种算法或已经建立好的数据结构来表示?编程语言并不重要(尽管我更喜欢Java)。

3 个答案:

答案 0 :(得分:1)

这棵树不好。其中有冗余数据。例如,节点2和4之间的连接在树中发生了3次。您需要一个“结构”来自动为您的问题提供解决方案,以便您更轻松地解决问题,但这不是解决问题的方式。输入数据是一组数据,输出数据是另一组数据,它们看起来可能相似,但也可以完全不同。

一个简单的矩阵,其中一个三角形为空,另一个包含数据,应具有所需的所有信息。矩阵的坐标是节点,像元是距离。这是您的输入数据。

您在代码中使用此矩阵所做的事情是另一回事。也许您想编写所有可能的路径。然后写它们。使用输入数据和您的代码生成输出数据。

答案 1 :(得分:1)

您要寻找的实际上是所有排列的生成器。如果您将一个城市固定为第一个城市(图中的伦敦),则需要生成所有剩余节点(华沙,罗兹,柏林)的列表的所有排列。

通常,通过遍历所有元素,将其取出并对其余元素进行递归,来递归地完成这种算法。通常使用库来实现此目的,例如e。 G。 itertools.permutations在Python中。

然后,应将以此方式生成的每个置换放入您最初想要的结果图中。为此,您可以使用任何您想要的图形表示形式。 G。嵌套的字典结构:

{ a: { b: { c: d,
            d: c },
       c: { b: d,
            d, b },
       d: { b: c,
            c: b } } }

答案 2 :(得分:1)

您的问题似乎非常接近经典中的经典traveling salesman problem
正如您所做的直觉一样,表示所有可能解的图确实是一棵树(从根到其任何叶的路径都应代表一个解)。
从那里,您可以问自己几个问题:

  • 我将是第一个访问重要信息的城市,还是仅重要的顺序?例如,伦敦-华沙-柏林-利兹等于华沙-柏林-利兹-伦敦吗?
    通常,我们认为这些解决方案等效于解决TSP,但您可能并非如此。

  • 您是否看到了潜在的TSP解决方案与排列之间的联系?实际上,您正在寻找的是一种生成给定集合(您的城市集合)的所有排列的方法(及其附带的数据结构)。

考虑到这两点,我们可以考虑一种生成此类树的方法。处理树木的好策略是递归思考。
我们有一个局部解决方案,表示k个第一城市。然后,下一个可能的城市可以是剩余的n-k个城市中的任何一个。这给出了以下伪代码。

get_all_permutations(TreeNode node, Set<int>not_visited){
    for (city in not_visited){
        new_set = copy(not_visited);
        new_set.remove(city);
        new_node = new TreeNode();
        new_node.city = city;
        node.add_child(new_node);
        get_all_permutations(new_node, new_set);
    }
}

这将以递归方式构建树。
根据您对我提到的第一个要点(关于第一个城市的重要性)的回答,您可能想要将城市分配给根节点。

如果您想进一步解决此类问题/想法,可以考虑一些优点,例如枚举算法和递归算法。当您的目标是枚举集合的所有元素时,它们通常是一个不错的选择。但是它们通常也是解决问题的效率低下的方法(例如,在TSP的情况下,使用该算法进行求解会导致效率非常低下。有很多更好的方法)。