
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 __NOTOC__
Queue () may refer to:
* Queue area, or queue, a line or area where people wait for goods or services
Arts, entertainment, and media
*''ACM Queue'', a computer magazine
* ''The Queue'' (Sorokin novel), a 1983 novel by Russian author ...
, 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 with ...
may build the
game tree
In the context of Combinatorial game theory, which typically studies sequential games with perfect information, a game tree is a graph representing all possible game states within such a game. Such games include well-known ones such as chess, c ...
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 alo ...
, 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
In computer science, iterative deepening search or more specifically iterative deepening depth-first search (IDS or IDDFS) is a state space/graph search strategy in which a depth-limited version of depth-first search is run repeatedly with incr ...
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
graph
Graph may refer to:
Mathematics
*Graph (discrete mathematics), a structure made of vertices and edges
**Graph theory, the study of such graphs and their properties
*Graph (topology), a topological space resembling a graph in the sense of discre ...
s, 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
Plankalkül () is a programming language designed for engineering purposes by Konrad Zuse between 1942 and 1945. It was the first high-level programming language to be designed for a computer.
''Kalkül'' is the German term for a formal system� ...
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 artific ...
, who used it to find the shortest path out of a maze,
and later developed by C. Y. Lee into a
wire routing
In electronic design, wire routing, commonly called simply routing, is a step in the design of printed circuit boards (PCBs) and integrated circuits (ICs). It builds on a preceding step, called placement, which determines the location of each ...
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 alo ...
, but differs from it in two ways:
# it uses a
queue __NOTOC__
Queue () may refer to:
* Queue area, or queue, a line or area where people wait for goods or services
Arts, entertainment, and media
*''ACM Queue'', a computer magazine
* ''The Queue'' (Sorokin novel), a 1983 novel by Russian author ...
(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
**Ger ...
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 ...
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
The space complexity of an algorithm or a computer program is the amount of memory space required to solve an instance of the computational problem as a function of characteristics of the input. It is the memory required by an algorithm until it ex ...
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 mut ...
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
In computing, tree data structures, and game theory, the branching factor is the number of children at each node, the outdegree. If this value is not uniform, an ''average branching factor'' can be calculated.
For example, in chess, if a "node" ...
" 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 i ...
,
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 simple ...
, 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 r ...
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