骑士的最短路径图数据结构和算法

时间:2012-08-30 10:43:50

标签: algorithm data-structures shortest-path chess search-tree

我对之前的一篇Stackflow帖子@ Knight's Shortest Path Chess Question

有疑问

我理解答案'好吧,这是一个图形问题,它的稀疏矩阵就像':

(a1,b3)=1,
(a1,c2)=1,
  .....

描述现有边缘。但是我仍然不知道这个图的数据结构应该是什么样的(它是一个邻接矩阵?在上面说'稀疏矩阵',还是别的什么?),这样Dijkstra的算法就可以很容易地使用它。

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

从算法描述中,如果图形数据结构是一组顶点,并且邻居顶点信息可用,则看起来很方便。但是我们如何实现这一目标呢?

任何人都可以帮助写出这个图的样本数据结构,并解释一下它如何方便地链接到Dijkstra的算法?

谢谢,

2 个答案:

答案 0 :(得分:1)

图形非常稀疏(64个顶点,每个顶点最多有8个边),因此邻接矩阵是一个浪费的IMO。

更好的结构是adjacency list

v1->v2,v3,v4,v5
v2->v1,...
...

我的想法确实是Set<Vertex>,而Vertex类型的字段List<Vertex> neighbors,其中包含所有顶点的邻居顶点。

在这种情况下,不需要额外的重量信息 - 因为图表未加权。

此外 - Dijkstra的算法是多余的。同样,图表是未加权的 - 因此,对于未加权图表,找到最短路径的更简单(编程和理解)和更快(运行时)算法是BFS

答案 1 :(得分:0)

由于只有64个图块,因此可以方便地将邻接矩阵放在64个64位整数的数组中。当然它很稀疏,但它也很小,所以浪费,如果它存在(指针与单个位相比相当大),也会很小。

从bitvector中提取索引列表在稀疏时也特别容易,但你甚至不需要 - 你可以让前面成为bitvectors的队列,而且“已经访问过“set可能是一个bitvector。

编辑:确实,如果你使用这个技巧,你可能仍然需要它,但是它仍然只需要几个快速操作,例如bitscan和x &= x -1