我在一个程序中使用广度优先搜索,该程序试图查找并返回未加权有向图上两个节点之间的最短路径。
我的程序像维基百科页面伪代码一样工作
该算法在遍历图时使用队列数据结构来存储中间结果,如下所示: 将根节点入队 将节点出列并检查它 如果在该节点中找到所寻找的元素,则退出搜索并返回结果。否则,将尚未发现的任何后继节点(直接子节点)排入队列。如果队列为空,则图上的每个节点都已检查——退出搜索并返回“未找到”。如果队列不为空,请从步骤 2 开始重复。
所以我一直在考虑如何跟踪执行的步骤数,但我遇到了 java 的局限性(我不太了解 java 的工作原理)。我最初认为我可以创建一些由我创建的存储步骤和节点的数据类型组成的队列,并且当它遍历图形时,它会跟踪步骤。如果达到目标,只需返回步骤即可。
我不知道如何在 java 中完成这项工作,所以我不得不摆脱这个想法,我继续使用那个不稳定的 Queue = 队列的新 LinkedList 实现。所以基本上我认为这是一个普通的整数队列,我无法使用我的数据类型来使用它。
所以现在我必须找到一种更基本的方法,所以我尝试使用一个简单的计数器,这不起作用,因为遍历算法在到达最短路径之前搜索了许多路径,所以我有了一个想法。我添加了第二个跟踪步数的队列,并添加了几个计数器。每当一个节点被添加到第一个队列中时,我都会添加到计数器中,这意味着我知道我正在检查新节点,所以我距离不远。一旦检查完所有这些,我就可以增加步数计数器,并且任何时候将节点添加到第一个队列中,我都会将步长值添加到步长队列中。步骤队列的管理与节点队列一样,因此当找到目标节点时,相应的步骤应该是要出列的步骤。
但是这不起作用,我遇到了很多问题,我实际上不知道为什么。
我在恐慌和沮丧中删除了我的大部分代码,但如果有人需要我,我会开始尝试重新创建它并在此处发布。
我的任何想法都接近了吗?我怎样才能让它们发挥作用?我相信也有一种标准且简单的方法可以做到这一点,但我还不够聪明。