【问题标题】:Knight's shortest path graph data structure and algorithmKnight的最短路径图数据结构与算法
【发布时间】:2012-08-25 01:48:56
【问题描述】:

我对以前的 Stack Overflow 帖子 @Knight's Shortest Path on Chessboard 有一个疑问

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

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

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

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

从算法描述来看,如果图数据结构是一组顶点,并且有可用的邻居顶点信息,看起来很方便。但是我们如何做到这一点呢?

如何为该图编写示例数据结构?我正在寻求了解如何将它方便地与 Dijkstra 算法联系起来。

【问题讨论】:

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


    【解决方案1】:

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

    一个更好的结构是adjacency list:

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

    这个想法确实是持有一个Set<Vertex>,并且对于Vertex类型有一个字段List<Vertex> neighbors,它将包含所有顶点的相邻顶点。

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

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

    【讨论】:

    • 谢谢阿米特。数据结构很有意义。正如你所说,BFS 是正确的选择(我实际上正在使用 BFS,在我借用 Dijkstra 提出数据结构问题的问题中:))。还有一个问题,在我的问题中,除了最短路径的长度之外,我还需要找到路径。但是,在 Dijkstra 中提出的“previous[v]”想法我不确定如何在 BFS 中实现它。因为我在 BFS 运行时创建了我的邻接列表,而不是将中间顶点放在一个集合中,所以当算法完成时那些中间顶点就消失了。那我该怎么办?
    • @user1559625:我曾经在this thread 中解决过这个问题。如果您在理解上有任何困难,请告诉我。
    • 酷。谢谢阿米特。这是一个很大的帮助。有什么好的算法入门/中级书籍推荐:)?我在算法上很弱。祝您有美好的一天,感谢所有的帮助。
    • @user1559625 CLRS Introduction to Algorithms 是一个很好的入门者。但只是一个初学者,经验是主要问题。参加编程竞赛、编写程序、回答 SO 问题——这些都会让你成为更好的程序员。
    【解决方案2】:

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

    从位向量中提取索引列表在稀疏时也特别容易,但是你甚至不需要它 - 你可以让前面是一个位向量队列,而“已访问”集合可以是单个位向量。

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

    【讨论】:

    • 感谢哈罗德的 cmets。
    • @user1559625 如果你不熟悉按位算法,也许你不应该使用这个,它会非常难以调试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多