如何解决带有集合的Python BFS
| 我遇到了一个涉及集合和双端队列的BFS代码,但我不太了解。我希望这里的某些pythonistas可以帮助解决n00b问题。from collections import deque
def bfs(g,start):
queue,enqueued = deque([(None,start)]),set([start])
while queue:
parent,n = queue.popleft()
yield parent,n
new = set(g[n]) - enqueued
enqueued |= new
queue.extend([(n,child) for child in new])
问题:
1)| =运算符似乎与按位运算有关-我不知道它与BFS有何关系,有什么提示吗?
2)popleft()应该只返回我所理解的一个值,那么在这里如何返回parent和n?
3)是否访问了一系列新节点?如果需要这些节点,是否只需将它们追加到列表中?
提前致谢。
克雷格
解决方法
sets1ѭ相同
作为
a = a.union(b)
。
popleft()
确实回来了
只有一个元素,恰好
是2元组,因此可以是
解压成两个值。
new
是尚未的集
访问的节点。
,只是为了回答您的最后一个问题:您拥有的代码段中有一个生成器,这意味着它在遍历图形广度优先时会产生节点。它不执行任何实际搜索,它只是为您遍历该节点。使用这段代码的方法是遍历结果,这将依次为您提供所有节点(以广度优先):
for parent_node,node in bfs(my_graph):
if node == needle:
break
或者,例如,如果要获取匹配特定条件的所有节点的列表:
nodes = [ node for parent_node,node in bfs(my_graph) if condition(node) ]
,1)
x |= y
将x设置为x和y的布尔或。 set
覆盖运算符,表示设置的并集。基本上,这是一种写ѭ9的好方法。
2)
queue
的第一个元素始终是2元组。
tpl = (a,b)
x,y = tpl
是一种奇特的写作方式
tpl = (a,b)
assert len(tpl) == 2
x = tpl[0]
y = tpl[0]
3)
new
只是-新的(未访问的)节点的临时变量。 enqueued
包含结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。