Breadth-First Search
   HOME

TheInfoList



OR:

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 O(, V, +, E, ), since every vertex and every edge will be explored in the worst case. , V, is the number of vertices and , E, is the number of edges in the graph. Note that O(, E, ) may vary between O(1) and O(, V, ^2), 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 O(, V, ), where , V, 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 G=(V,E) be a graph with n vertices. Recall that N(v) is the set of neighbors of v. Let \sigma=(v_1,\dots,v_m) be a list of distinct elements of V, for v\in V\setminus\, let \nu_(v) be the least i such that v_i is a neighbor of v, if such a i exists, and be \infty otherwise. Let \sigma=(v_1,\dots,v_n) be an enumeration of the vertices of V. The enumeration \sigma is said to be a BFS ordering (with source v_1) if, for all 1, v_i is the vertex w\in V\setminus\ such that \nu_(w) is minimal. Equivalently, \sigma is a BFS ordering if, for all 1\le i with v_i\in N(v_k)\setminus N(v_j), there exists a neighbor v_m of v_j such that m.


Applications

Breadth-first search can be used to solve many problems in graph theory, for example: * Copying
garbage collection Waste collection is a part of the process of waste management. It is the transfer of solid waste from the point of use and disposal to the point of treatment or landfill. Waste collection also includes the curbside collection of recyclabl ...
, Cheney's algorithm * Finding the
shortest path In graph theory, the shortest path problem is the problem of finding a path between two vertices (or nodes) in a graph such that the sum of the weights of its constituent edges is minimized. The problem of finding the shortest path between ...
between two nodes ''u'' and ''v'', with path length measured by number of edges (an advantage over
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 ...
) * (Reverse) Cuthill–McKee mesh numbering * Ford–Fulkerson method for computing the maximum flow in a
flow network In graph theory, a flow network (also known as a transportation network) is a directed graph where each edge has a capacity and each edge receives a flow. The amount of flow on an edge cannot exceed the capacity of the edge. Often in operations re ...
* Serialization/Deserialization of a binary tree vs serialization in sorted order, allows the tree to be re-constructed in an efficient manner. * Construction of the ''failure function'' of the Aho-Corasick pattern matcher. *Testing bipartiteness of a graph. *Implementing parallel algorithms for computing a graph's transitive closure.


See also

*
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 ...
* Iterative deepening depth-first search * Level structure *
Lexicographic breadth-first search In computer science, lexicographic breadth-first search or Lex-BFS is a linear time algorithm for ordering the vertices of a graph. The algorithm is different from a breadth-first search, but it produces an ordering that is consistent with breadth ...
* Parallel breadth-first search


References

*


External links

{{Commons category, Breadth-first search
Open Data Structures - Section 12.3.1 - Breadth-First Search
Pat Morin Graph algorithms Search algorithms