如何为邻接列表构建适合BFS的数据结构?

时间:2013-04-02 21:40:12

标签: c# data-structures graph adjacency-list

关于构建和搜索邻接树的采访问题,但我以前从未与他们合作过,所以我不知道从哪里开始。

我有一个包含以下数据的文件:

2 13556 225 235
225 2212 226
2212 8888 2213
8888 144115 72629 141336 8889 146090 129948 167357
144115 160496 163089 144114 144116
...

格式化如下:

<parent node> <child node> [ <child node> [ …] ]

每条边的长度都为1。

然后我需要计算两个节点之间的最短路径(这两个节点在问题中指定)。然后,我需要提供big-O表示法的估计复杂性。

后者我可能会捏造,虽然我从来没有听说过它直到现在,维基百科在理解如何将搜索功能分解为大O方面对我没什么帮助,但我会担心稍后(除非有人有可以分享的良好链接)。

我现在关注的是尝试对这些数据进行建模,然后搜索最短路径。就像我说的那样,我以前从未使用过这种结构,所以我有点不知道从哪里开始。我在邻接列表here上找到了另一个问题,但它似乎并不是我想要的,除非我完全忽略了这一点。在我看来,输入数据需要重新组织以满足该问题中使用的结构,而我正在从文件中读取数据,所以我认为我需要遍历每个节点和节点列表到确定我是否已经输入了父母,这可能需要很长时间。我也看不到如何使用该结构创建bfs搜索。

有很多搜索的例子,所以我可以理清那部分,但是启动数据模型的任何帮助都适合从数据文件加载并适合bfs搜索(或者,如果那里有更好的搜索选项,请告诉我),会有很大的帮助。

1 个答案:

答案 0 :(得分:1)

您希望将此数据存储在HashTable<int, List<int>>(字典)(链接)中,密钥为int(NodeID),值为List<int>,其中这些是来自节点的可能目的地是关键。

您需要另外一个HashTable<int, int>(ShortestPathLastStep),它将存储两个NodeID。这将代表到达给定节点的最短路径中的最后一步。你需要这个能够回放最短的路径。

要执行BFS(广度优先搜索),您将使用Queue<int>(bfsQueue)。将开始节点(在您的问题中给出)推入队列。现在执行以下算法

-- currentNodeID = pop bfsQueue
---- children = Links[NodeID]
------ foreach (childNodeID in children)
--------- if (childNodeID == destinationNodeID)
----------- exit and playback shortest path
----------if (!ShortestPathLastStep.contains(childNodeID))
------------ ShortestPathLastStep.Add(childNodeID, currentNodeID);
----------bfsQueue.Push(childNodeID);
----------goto first line

此解决方案假设在任意两个节点之间行进是一个不变的成本。它是BFS的理想选择,因为当您第一次到达目的地时,您将采用最短路径(如果链路具有可变长度,则不是这样)。如果链接不是常量长度,则在决定覆盖ShortestPathLastStep值时必须添加更多逻辑,在队列为EMPTY之前您将无法退出,并且如果您已经将节点推送到队列中从来没有去过节点(它不会存在于短路径列表中)或者你发现这种到达那里的新方式比到达那里的最后一种方式更短(现在你必须重新计算节点的最短距离)你可以从这个节点来。)