Стандартная реализация BFS что-то вроде (любезно Википедия):Малого BFS Деталь Разъяснение
Breadth-First-Search(Graph, root):
create empty set S
create empty queue Q
root.parent = NIL
Q.enqueue(root)
while Q is not empty:
current = Q.dequeue()
if current is the goal
return current
for each node n that is adjacent to current:
if n is not in S:
add n to S
n.parent = current
Q.enqueue(n)
мне было интересно, почему проверка, чтобы увидеть, если текущая цель не может быть сделана, глядя через сосед смежных к текущему. Напр. что-то вроде:
Breadth-First-Search(Graph, root):
create empty set S
create empty queue Q
root.parent = NIL
if root is the goal
return root
Q.enqueue(root)
while Q is not empty:
current = Q.dequeue()
for each node n that is adjacent to current:
if n is the goal // check here instead
n.parent = current
return n
if n is not in S:
add n to S
n.parent = current
Q.enqueue(n)
Идея состоит в том, что вы поймаете слово, как только оно будет найдено в соседнем. Вы можете убедиться, что это кратчайший путь, потому что путь в очереди уже не содержит пути, так как мы могли бы поймать этот случай до того, как это произошло.
Я понимаю, что это означает необходимость добавления дополнительной проверки перед циклом while, чтобы узнать, является ли корень целью, но кроме этого, есть ли какая-то причина, по которой bfs не реализована так? Это должно быть технически быстрее?