Breadth-first search (BFS) is an
algorithm
In mathematics and computer science, an algorithm () is a finite sequence of rigorous instructions, typically used to solve a class of specific problems or to perform a computation. Algorithms are used as specifications for performing ...
for searching a
tree
In botany, a tree is a perennial plant with an elongated stem, or trunk, usually supporting branches and leaves. In some usages, the definition of a tree may be narrower, including only woody plants with secondary growth, plants that are ...
data structure for a node that satisfies a given property. It starts at the
tree root
In vascular plants, the roots are the organs of a plant that are modified to provide anchorage for the plant and take in water and nutrients into the plant body, which allows plants to grow taller and faster. They are most often below the sur ...
and explores all nodes at the present
depth prior to moving on to the nodes at the next depth level. Extra memory, usually a
queue, is needed to keep track of the child nodes that were encountered but not yet explored.
For example, in a
chess endgame
In chess and other similar games, the endgame (or end game or ending) is the stage of the game when few pieces are left on the board.
The line between middlegame and endgame is often not clear, and may occur gradually or with the quick exchange ...
a
chess engine
In computer chess, a chess engine is a computer program that analyzes chess or chess variant positions, and generates a move or list of moves that it regards as strongest.
A chess engine is usually a back end with a command-line interface wit ...
may build the
game tree from the current position by applying all possible moves, and use breadth-first search to find a win position for white. Implicit trees (such as game trees or other problem-solving trees) may be of infinite size; breadth-first search is guaranteed to find a solution node if one exists.
In contrast, (plain)
depth-first search
Depth-first search (DFS) is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible a ...
, which explores the node branch as far as possible before backtracking and expanding other nodes, may get lost in an infinite branch and never make it to the solution node.
Iterative deepening depth-first search avoids the latter drawback at the price of exploring the tree's top parts over and over again. On the other hand, both depth-first algorithms get along without extra memory.
Breadth-first search can be generalized to
graphs, when the start node (sometimes referred to as a 'search key') is explicitly given, and precautions are taken against following a vertex twice.
BFS and its application in finding
connected components of graphs were invented in 1945 by
Konrad Zuse
Konrad Ernst Otto Zuse (; 22 June 1910 – 18 December 1995) was a German civil engineer, pioneering computer scientist, inventor and businessman. His greatest achievement was the world's first programmable computer; the functional program- ...
, in his (rejected) Ph.D. thesis on the
Plankalkül programming language, but this was not published until 1972.
[. See pp. 96–105 of the linked pdf file (internal numbering 2.47–2.56).] It was reinvented in 1959 by
Edward F. Moore
Edward Forrest Moore (November 23, 1925 in Baltimore, Maryland – June 14, 2003 in Madison, Wisconsin) was an American professor of mathematics and computer science, the inventor of the Moore finite state machine, and an early pioneer of artifi ...
, who used it to find the shortest path out of a maze,
and later developed by C. Y. Lee into a
wire routing algorithm (published 1961).
Pseudocode
Input: A graph and a ''starting vertex'' of
Output: Goal state. The ''parent'' links trace the shortest path back to
1 procedure BFS(''G'', ''root'') is
2 let ''Q'' be a queue
3 label ''root'' as explored
4 ''Q''.enqueue(''root'')
5 while ''Q'' is not empty do
6 ''v'' := ''Q''.dequeue()
7 if ''v'' is the goal then
8 return ''v''
9 for all edges from ''v'' to ''w'' in ''G''.adjacentEdges(''v'') do
10 if ''w'' is not labeled as explored then
11 label ''w'' as explored
12 ''w''.parent := ''v''
13 ''Q''.enqueue(''w'')
More details
This non-recursive implementation is similar to the non-recursive implementation of
depth-first search
Depth-first search (DFS) is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible a ...
, but differs from it in two ways:
# it uses a
queue (First In First Out) instead of a
stack
Stack may refer to:
Places
* Stack Island, an island game reserve in Bass Strait, south-eastern Australia, in Tasmania’s Hunter Island Group
* Blue Stack Mountains, in Co. Donegal, Ireland
People
* Stack (surname) (including a list of people ...
and
# it checks whether a vertex has been explored before enqueueing the vertex rather than delaying this check until the vertex is dequeued from the queue.
If is a
tree
In botany, a tree is a perennial plant with an elongated stem, or trunk, usually supporting branches and leaves. In some usages, the definition of a tree may be narrower, including only woody plants with secondary growth, plants that are ...
, replacing the queue of this breadth-first search algorithm with a stack will yield a depth-first search algorithm. For general graphs, replacing the stack of the iterative depth-first search implementation with a queue would also produce a breadth-first search algorithm, although a somewhat nonstandard one.
The ''Q'' queue contains the frontier along which the algorithm is currently searching.
Nodes can be labelled as explored by storing them in a set, or by an attribute on each node, depending on the implementation.
Note that the word ''node'' is usually interchangeable with the word ''vertex''.
The ''parent'' attribute of each node is useful for accessing the nodes in a shortest path, for example by backtracking from the destination node up to the starting node, once the BFS has been run, and the predecessors nodes have been set.
Breadth-first search produces a so-called ''breadth first tree''. You can see how a ''breadth first tree'' looks in the following example.
Example
The following is an example of the breadth-first tree obtained by running a BFS on
German
German(s) may refer to:
* Germany (of or related to)
**Germania (historical use)
* Germans, citizens of Germany, people of German ancestry, or native speakers of the German language
** For citizens of Germany, see also German nationality law
**Ge ...
cities starting from ''Frankfurt'':
Analysis
Time and space complexity
The
time complexity
In computer science, the time complexity is the computational complexity that describes the amount of computer time it takes to run an algorithm. Time complexity is commonly estimated by counting the number of elementary operations performed by t ...
can be expressed as
, since every vertex and every edge will be explored in the worst case.
is the number of vertices and
is the number of edges in the graph.
Note that
may vary between
and
, depending on how sparse the input graph is.
When the number of vertices in the graph is known ahead of time, and additional data structures are used to determine which vertices have already been added to the queue, the
space complexity can be expressed as
, where
is the number of vertices. This is in addition to the space
required for the graph itself, which may vary depending on the
graph representation
In computer science, a graph is an abstract data type that is meant to implement the undirected graph and directed graph concepts from the field of graph theory within mathematics.
A graph data structure consists of a finite (and possibly mu ...
used by an implementation of the algorithm.
When working with graphs that are too large to store explicitly (or infinite), it is more practical to describe the complexity of breadth-first search in different terms: to find the nodes that are at distance from the start node (measured in number of edge traversals), BFS takes time and memory, where is the "
branching factor" of the graph (the average out-degree).
Completeness
In the analysis of algorithms, the input to breadth-first search is assumed to be a finite graph, represented as an
adjacency list
In graph theory and computer science, an adjacency list is a collection of unordered lists used to represent a finite graph. Each unordered list within an adjacency list describes the set of neighbors of a particular vertex in the graph. This is ...
,
adjacency matrix
In graph theory and computer science, an adjacency matrix is a square matrix used to represent a finite graph. The elements of the matrix indicate whether pairs of vertices are adjacent or not in the graph.
In the special case of a finite simp ...
, or similar representation. However, in the application of graph traversal methods in
artificial intelligence
Artificial intelligence (AI) is intelligence—perceiving, synthesizing, and inferring information—demonstrated by machines, as opposed to intelligence displayed by animals and humans. Example tasks in which this is done include speech ...
the input may be an
implicit representation of an infinite graph. In this context, a search method is described as being complete if it is guaranteed to find a goal state if one exists. Breadth-first search is complete, but depth-first search is not. When applied to infinite graphs represented implicitly, breadth-first search will eventually find the goal state, but depth first search may get lost in parts of the graph that have no goal state and never return.
[Coppin, B. (2004). Artificial intelligence illuminated. Jones & Bartlett Learning. pp. 79–80.]
BFS ordering
An enumeration of the vertices of a graph is said to be a BFS ordering if it is the possible output of the application of BFS to this graph.
Let
be a graph with
vertices. Recall that
is the set of neighbors of
.
Let
be a list of distinct elements of
, for
, let
be the least
such that
is a neighbor of
, if such a
exists, and be
otherwise.
Let
be an enumeration of the vertices of
.
The enumeration
is said to be a BFS ordering (with source
) if, for all