【发布时间】:2017-05-04 18:38:32
【问题描述】:
所以,我有这张图,我想使用广度优先搜索算法来查看是否存在从一个顶点到另一个顶点的路径。
所以,我在 python 中实现了一个函数,它根据路径的存在返回 true 或 false,并且它可以工作。好吧,它适用于我所做的测试。我想知道的是这是否确实是一种呼吸优先搜索算法。我之前没有见过任何 BFS 算法,我只知道它的基本思想。我听说 BFS 是递归实现的,虽然我是迭代实现的,这就是为什么我对此表示怀疑。所以,这是我的图表的函数和表示:
outb = {1: [2, 3],
2: [4, 5],
3: [5, 11, 12],
4: [6, 7],
5: [7],
6: [9, 10],
7: [8],
11: [3],
12: [15, 14, 13],
13: [17],
14: [17],
15: [12, 5, 8, 16],
17: [18]}
def BFS(v1, v2):
parsed = []
toParse = [v1]
current = v1
while len(toParse) > 0:
while current in parsed:
current = toParse.pop(0)
if current not in outb:
return False
if v2 in outb[current]:
return True
toParse += outb[current]
parsed.append(current)
return False
我的最后一个问题是:BFS 是否就其本质而言是寻找从一个顶点到另一个顶点的最短路径?我在互联网上看到了这件事,我想确定一下。
【问题讨论】:
-
阅读wikipedia page。看起来您的代码在那里实现了算法,并声明 BFS 找到了最短路径。
-
将您的代码与维基百科中的伪代码进行比较,
S == parsed、Q == toParse、current == current。 -
你的代码是BFS,但也是错误的,因为
current not in outb不代表没有路径,你尝试做toParse.pop(0)而不考虑toParse是否真的有任何元素.此外,对于大多数使用的数据结构来说,列表并不是一个有效的选择。 -
@user2357112 current not in outb 是错误检查,以确保您没有从不在图中的节点寻找路径。此外,代码会检查 toParse 是否有任何元素。 pop 调用发生在 while 循环中,并以此为条件。
-
@DanHall:图中有些节点不是
in outb,因为有人选择在outb中省略没有出边的键。如果搜索在到达目的地之前就到达了这样一个节点,搜索会错误输出False。
标签: python graph-theory breadth-first-search