我对之前的一篇Stackflow帖子@ Knight's Shortest Path Chess Question
有疑问我理解答案'好吧,这是一个图形问题,它的稀疏矩阵就像':
(a1,b3)=1,
(a1,c2)=1,
.....
描述现有边缘。但是我仍然不知道这个图的数据结构应该是什么样的(它是一个邻接矩阵?在上面说'稀疏矩阵',还是别的什么?),这样Dijkstra的算法就可以很容易地使用它。
http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
从算法描述中,如果图形数据结构是一组顶点,并且邻居顶点信息可用,则看起来很方便。但是我们如何实现这一目标呢?
任何人都可以帮助写出这个图的样本数据结构,并解释一下它如何方便地链接到Dijkstra的算法?
谢谢,
答案 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
。