什么更快?在矩阵或列表中搜索最短路径?

时间:2011-03-18 19:41:37

标签: list graph path performance shortest

我必须存储一些城市和一些城市之间的距离,然后搜索最短的路径。从文件中读取城市和距离。 我开始做一个矩阵,但看到它花了太多空间(超过两倍),所以我改成了一个列表。每个列表项存储3个东西:point1,point2和它们之间的距离。

例如,我有这个文件:

  

雅典斯德哥尔摩34
  斯德哥尔摩布拉格23

当我读取时,它存储在数组中:

          _____0______ ______1______
point1   | Athens     | Stockholm   |
point2   | Stockholm  | Prague      |
distance | 34         | 23          |
          ------------ -------------

然后我有些怀疑..这肯定会节省空间但是需要花费更多时间才能完成吗?列表是一个数组,但连接(边缘)以任意方式放置,这就是为什么我开始认为它可能比使用矩阵花费更多时间。

4 个答案:

答案 0 :(得分:2)

您可能希望查看图的邻接列表表示,这是您的第二个想法的修改版本,它最适合最短路径问题。我们的想法是拥有一个节点表,您可以为每个节点存储该节点的传出边列表。这允许您迭代所有边缘,使节点的时间与离开节点的边数成比例,而不是图中边的总数(正如您在上面建议的矩阵和列表版本中所拥有的那样)。出于这个原因,大多数用于进行图搜索的快速算法都使用邻接列表。

希望他的帮助!

答案 1 :(得分:2)

将名称与距离分开。创建一个仅包含城市名称的列表。

          _____0______ ______1______ ______2______ 
city     | Athens     | Stockholm   | Prague      |
          ------------ ------------- -------------

然后单独创建矩阵

     __0__ __1__ __2__ 
 0  | 0   | 34  | 0   |
     ----- ----- -----
 1  | 34  | 0   | 23  |
     ----- ----- -----
 2  | 0   | 23  | 0   |
     ----- ----- -----

如果您想搜索从布拉格到雅典的路线,那么您首先要找到布拉格和雅典在列表中的位置......

  • 布拉格:2
  • 雅典:0

然后在矩阵中搜索您的路径。

  • (2,1,23) - > (1,0,34)

最后,您使用列表转换为城市

  • (布拉格,斯德哥尔摩,23) - > (斯德哥尔摩,雅典,34)

答案 2 :(得分:1)

我认为这里的顽固性列表肯定是最好的选择。这对于D / BFS或Dijkstra等算法来说非常有用。

如果你不知道如何保持城镇和距离只是使用一些结构来保持他们在一起。如果你可以使用编号的索引城镇,你将只使用一个简单的对结构(最简单的实现将是n个STL向量对。

当然,如果您不想使用STL,您应该尝试使用您想要使用的指针来实现自己的结构列表。

答案 3 :(得分:0)

你的方法看起来很好。

要放松心情,请记住,解析单个列表/数组总是比使用两个(或更多)列表更快,更加资源友好,而实际上只需要查找预定义数据的单行/条目。

我倾向于不同意这里的其他一些答案,因为我认为没有必要使事情复杂化。查找几个数据单元以及需要将这些数据单元组合在一起以生成结果数据集(如提出的一些答案),需要采取更多步骤,而不是在列表上执行简单的一次性运行来获取一行数据。对于在多个列表中查找和组合分布式数据单元的函数,您只会冒失去CPU周期和内存资源的风险,而您当前使用的数据已经合并为一组完美结果。

Simpler说:在速度方面,对你目前所拥有的列表/数组做一个简单的破坏很难被击败。