Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Breadth-first search
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{Short description|Algorithm to search the nodes of a graph}} {{more citations needed|date=April 2012}} [[Image:Animated BFS.gif|thumb|187px|Animated example of a breadth-first search. Black: explored, grey: queued to be explored later on]] [[File:BFS-Algorithm Search Way.gif|thumb|BFS on [[Maze-solving algorithm]]]] [[File:Tic-tac-toe-game-tree.svg|thumb|187px|Top part of [[Tic-tac-toe]] game tree]] '''Breadth-first search''' ('''BFS''') is an [[algorithm]] for searching a [[Tree (data structure)|tree]] data structure for a node that satisfies a given property. It starts at the [[tree (data structure)#Terminology|tree root]] and explores all nodes at the present [[tree (data structure)#Terminology|depth]] prior to moving on to the nodes at the next depth level. Extra memory, usually a [[queue (data structure)|queue]], is needed to keep track of the child nodes that were encountered but not yet explored. For example, in a [[chess endgame]], a [[chess engine]] 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<ref>that is, a node satisfying the specified property</ref> if one exists. In contrast, (plain) [[depth-first search]] (DFS), which explores the node branch as far as possible before backtracking and expanding other nodes,<ref>{{cite book |author=Cormen Thomas H. |display-authors=etal |title=Introduction to Algorithms |publisher=MIT Press |date=2009 |chapter=22.3}}</ref> 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 typically require far less extra memory than breadth-first search.<ref>{{Cite journal |last=Korf |first=Richard E. |author-link=Richard E. Korf|date=1985 |title=Depth-First Iterative Deepening: An Optimal Admissible Tree Search |url=https://doi.org/10.7916/D8HQ46X1 |journal=Artificial Intelligence |language=en |issue=27 |pages=99–100 |doi=10.7916/D8HQ46X1}}</ref> Breadth-first search can be generalized to both [[undirected graph]]s and [[directed graph]]s with a given start node (sometimes referred to as a 'search key').<ref>{{cite web |url=http://www.graph500.org/specifications#sec-5 |title=Graph500 benchmark specification (supercomputer performance evaluation) |publisher=Graph500.org, 2010 |access-date=2015-03-15 |archive-url=https://web.archive.org/web/20150326055019/http://www.graph500.org/specifications#sec-5#sec-5 |archive-date=2015-03-26 |url-status=dead }}</ref> In [[state space search]] in [[artificial intelligence]], repeated searches of vertices are often allowed, while in theoretical analysis of algorithms based on breadth-first search, precautions are typically taken to prevent repetitions. BFS and its application in finding [[Connected component (graph theory)|connected components]] of graphs were invented in 1945 by [[Konrad Zuse]], in his (rejected) Ph.D. thesis on the [[Plankalkül]] programming language, but this was not published until 1972.<ref name=":0">{{citation|title=Der Plankalkül|first=Konrad|last=Zuse|author-link=Konrad Zuse|publisher=Konrad Zuse Internet Archive|year=1972|url=http://zuse.zib.de/item/gHI1cNsUuQweHB6|language=de}}. See pp. 96–105 of the linked pdf file (internal numbering 2.47–2.56).</ref> It was reinvented in 1959 by [[Edward F. Moore]], who used it to find the shortest path out of a maze,<ref>{{cite conference|first=Edward F.|last=Moore|author-link=Edward F. Moore|year=1959|contribution=The shortest path through a maze|title=Proceedings of the International Symposium on the Theory of Switching|publisher=Harvard University Press|pages=285–292}} As cited by Cormen, Leiserson, Rivest, and Stein.</ref><ref name="skiena">{{cite book |first=Steven |last=Skiena |author-link=Steven Skiena |title=The Algorithm Design Manual |publisher=Springer |year=2008 |page=480 |doi=10.1007/978-1-84800-070-4_4|chapter=Sorting and Searching |isbn=978-1-84800-069-8 |bibcode=2008adm..book.....S }}</ref> and later developed by C. Y. Lee into a [[Routing (electronic design automation)|wire routing]] algorithm (published in 1961).<ref>{{cite journal |title=An Algorithm for Path Connections and Its Applications |first1=C. Y. |last1=Lee |journal=IRE Transactions on Electronic Computers |year=1961 |issue=3 |pages=346–365 |doi=10.1109/TEC.1961.5219222 |s2cid=40700386 }}</ref> == Pseudocode == '''Input''': A graph {{mvar|G}} and a starting vertex {{mvar|root}} of {{mvar|G}} '''Output''': Goal state. The ''parent'' links trace the shortest path back to {{mvar|root}}<ref>{{Cite book|last=Cormen, Thomas H.|url=http://worldcat.org/oclc/1006880283|title=Introduction to algorithms|isbn=978-81-203-4007-7|chapter=22.2 Breadth-first search|date=January 2010 |publisher=Prentice-Hall Of India Pvt. Limited |oclc=1006880283}}</ref> 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 === [[Image:MapGermanyGraph.svg|thumb|250px|An example map of [[Southern Germany]] with some connections between cities]] [[Image:GermanyBFS.svg|thumb|250px|The breadth-first tree obtained when running BFS on the given map and starting in [[Frankfurt]]]] This non-recursive implementation is similar to the non-recursive implementation of [[depth-first search]], but differs from it in two ways: # it uses a [[Queue (abstract data type)|queue]] ([[First In First Out]]) instead of a [[Stack (abstract data type)|stack]] (Last In First Out) 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 {{mvar|G}} is a [[Tree (data structure)|tree]], 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.<ref>{{Cite web|title=Stack-based graph traversal ≠ depth first search|url=https://11011110.github.io/blog/2013/12/17/stack-based-graph-traversal.html|access-date=2020-06-10|website=11011110.github.io}}</ref> 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'' which is shown in the example below. === Example === The lower diagram shows the breadth-first tree obtained by running a BFS on an example graph of [[Germany|German]] cities (upper diagram) starting from ''Frankfurt''. == Analysis == === Time and space complexity === The [[time complexity]] can be expressed as <math>O(|V|+|E|)</math>, as every vertex and every edge will be explored in the worst case. <math>|V|</math> is the number of vertices and <math>|E|</math> is the number of edges in the graph. Note that <math>O(|E|)</math> may vary between <math>O(1)</math> and <math> O(|V|^2)</math>, depending on how sparse the input graph is.<ref name=clrs>{{Introduction to Algorithms|edition=2|chapter=22.2 Breadth-first search|pages=531–539}}</ref> 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 <math>O(|V|)</math>, where <math>|V|</math> is the number of vertices. This is in addition to the space required for the graph itself, which may vary depending on the [[Graph (abstract data type)|graph representation]] 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 {{mvar|d}} from the start node (measured in number of edge traversals), BFS takes {{math|''O''(''b''<sup>''d'' + 1</sup>)}} time and memory, where {{mvar|b}} is the "[[branching factor]]" of the graph (the average out-degree).<ref>{{Cite AIMA|edition=2}}</ref>{{rp|81}} === Completeness === In the analysis of algorithms, the input to breadth-first search is assumed to be a finite graph, represented as an [[adjacency list]], [[adjacency matrix]], or similar representation. However, in the application of graph traversal methods in [[artificial intelligence]] the input may be an [[implicit graph|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.<ref name="coppin">Coppin, B. (2004). Artificial intelligence illuminated. Jones & Bartlett Learning. pp. 79–80.</ref> ==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 <math>G=(V,E)</math> be a graph with <math>n</math> vertices. Recall that <math>N(v)</math> is the set of neighbors of <math>v</math>. Let <math>\sigma=(v_1,\dots,v_m)</math> be a list of distinct elements of <math>V</math>, for <math>v\in V\setminus\{v_1,\dots,v_m\}</math>, let <math>\nu_{\sigma}(v)</math> be the least <math>i</math> such that <math>v_i</math> is a neighbor of <math>v</math>, if such a <math>i</math> exists, and be <math>\infty</math> otherwise. Let <math>\sigma=(v_1,\dots,v_n)</math> be an enumeration of the vertices of <math>V</math>. The enumeration <math>\sigma</math> is said to be a BFS ordering (with source <math>v_1</math>) if, for all <math>1<i\le n</math>, <math>v_i</math> is the vertex <math>w\in V\setminus\{v_1,\dots,v_{i-1}\}</math> such that <math>\nu_{(v_1,\dots,v_{i-1})}(w)</math> is minimal. Equivalently, <math>\sigma</math> is a BFS ordering if, for all <math>1\le i<j<k\le n</math> with <math>v_i\in N(v_k)\setminus N(v_j)</math>, there exists a neighbor <math>v_m</math> of <math>v_j</math> such that <math>m<i</math>. == Applications == Breadth-first search can be used to solve many problems in graph theory, for example: * Copying [[Garbage collection (computer science)|garbage collection]], [[Cheney's algorithm]] * Finding the [[shortest path]] between two nodes ''u'' and ''v'', with path length measured by number of edges (an advantage over [[depth-first search]])<ref>{{cite book | title = Algorithms for Interviews | page = 144 | chapter = 4. Algorithms on Graphs | last1 = Aziz | first1 = Adnan | last2 = Prakash | first2 = Amit | date = 2010 | publisher = Algorithmsforinterviews.com | isbn = 978-1453792995 }}</ref> * [[Cuthill–McKee algorithm|(Reverse) Cuthill–McKee]] mesh numbering * [[Ford–Fulkerson algorithm|Ford–Fulkerson method]] for computing the [[maximum flow problem|maximum flow]] in a [[flow network]] * 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 [[Bipartite graph#Testing bipartiteness|bipartiteness of a graph]]. *Implementing parallel algorithms for computing a graph's transitive closure. <ref>{{cite book |last1=Dhulipala |first1=Laxman |last2=Blelloch |first2=Guy E. |last3=Shun |first3=Julian |title=Theoretically Efficient Parallel Graph Algorithms Can Be Fast and Scalable |date=August 21, 2019 |page=17 |doi=10.1145/3210377.3210414 |arxiv=1805.05208 |isbn=9781450357999 |s2cid=44126609 }}</ref> == See also == * [[Depth-first search]] * [[Iterative deepening depth-first search]] * [[Level structure]] * [[Lexicographic breadth-first search]] * [[Parallel breadth-first search]] * [[Dijkstra's algorithm]] == References == {{reflist}} {{refbegin}} * {{Citation | last=Knuth | first=Donald E. | title=The Art of Computer Programming Vol 1. 3rd ed. | publisher=Addison-Wesley | place=Boston | year=1997 | isbn=978-0-201-89683-1 | url=http://www-cs-faculty.stanford.edu/~knuth/taocp.html | access-date=2008-02-09 | archive-date=2008-09-04 | archive-url=https://web.archive.org/web/20080904163709/http://www-cs-faculty.stanford.edu/~knuth/taocp.html | url-status=dead }} {{refend}} == External links == * [https://web.archive.org/web/20141029100806/http://opendatastructures.org/versions/edition-0.1e/ods-java/12_3_Graph_Traversal.html#SECTION001531000000000000000 Open Data Structures - Section 12.3.1 - Breadth-First Search], [[Pat Morin]] {{Data structures and algorithms}} {{Graph traversal algorithms}} [[Category:Graph algorithms]] [[Category:Search algorithms]]
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Citation
(
edit
)
Template:Cite AIMA
(
edit
)
Template:Cite book
(
edit
)
Template:Cite conference
(
edit
)
Template:Cite journal
(
edit
)
Template:Cite web
(
edit
)
Template:Data structures and algorithms
(
edit
)
Template:Graph traversal algorithms
(
edit
)
Template:Introduction to Algorithms
(
edit
)
Template:Math
(
edit
)
Template:More citations needed
(
edit
)
Template:Mvar
(
edit
)
Template:Refbegin
(
edit
)
Template:Refend
(
edit
)
Template:Reflist
(
edit
)
Template:Rp
(
edit
)
Template:Short description
(
edit
)