Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Depth-first search

From Wikipedia, the free encyclopedia
Search algorithm
This articleneeds additional citations forverification. Please helpimprove this article byadding citations to reliable sources. Unsourced material may be challenged and removed.
Find sources: "Depth-first search" – news ·newspapers ·books ·scholar ·JSTOR
(July 2010) (Learn how and when to remove this message)
Depth-first search
A tree labeled by the order in which DFS expands its nodes
ClassSearch algorithm
Data structureGraph
Worst-caseperformanceO(|V|+|E|){\displaystyle O(|V|+|E|)} for explicit graphs traversed without repetition,O(bd){\displaystyle O(b^{d})} for implicit graphs with branching factorb searched to depthd
Worst-casespace complexityO(|V|){\displaystyle O(|V|)} if entire graph is traversed without repetition, O(longest path length searched) =O(bd){\displaystyle O(bd)}for implicit graphs without elimination of duplicate nodes
Optimalno (does not generally find shortest paths)

Depth-first search (DFS) is analgorithm for traversing or searchingtree orgraph data structures. The algorithm starts at theroot node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible along each branch before backtracking. Extra memory, usually astack, is needed to keep track of the nodes discovered so far along a specified branch which helps in backtracking of the graph.

A version of depth-first search was investigated in the 19th century by French mathematicianCharles Pierre Trémaux[1] as a strategy forsolving mazes.[2][3]

Properties

[edit]

Thetime andspace analysis of DFS differs according to its application area. In theoretical computer science, DFS is typically used to traverse an entire graph, and takes timeO(|V|+|E|){\displaystyle O(|V|+|E|)},[4] where|V|{\displaystyle |V|} is the number ofvertices and|E|{\displaystyle |E|} the number ofedges. This is linear in the size of the graph. In these applications it also uses spaceO(|V|){\displaystyle O(|V|)} in the worst case to store thestack of vertices on the current search path as well as the set of already-visited vertices. Thus, in this setting, the time and space bounds are the same as forbreadth-first search and the choice of which of these two algorithms to use depends less on their complexity and more on the different properties of the vertex orderings the two algorithms produce.

For applications of DFS in relation to specific domains, such as searching for solutions inartificial intelligence or web-crawling, the graph to be traversed is often either too large to visit in its entirety or infinite (DFS may suffer fromnon-termination). In such cases, search is only performed to alimited depth; due to limited resources, such as memory or disk space, one typically does not use data structures to keep track of the set of all previously visited vertices. When search is performed to a limited depth, the time is still linear in terms of the number of expanded vertices and edges (although this number is not the same as the size of the entire graph because some vertices may be searched more than once and others not at all) but the space complexity of this variant of DFS is only proportional to the depth limit, and as a result, is much smaller than the space needed for searching to the same depth using breadth-first search. For such applications, DFS also lends itself much better toheuristic methods for choosing a likely-looking branch. When an appropriate depth limit is not known a priori,iterative deepening depth-first search applies DFS repeatedly with a sequence of increasing limits. In the artificial intelligence mode of analysis, with abranching factor greater than one, iterative deepening increases the running time by only a constant factor over the case in which the correct depth limit is known due to the geometric growth of the number of nodes per level.

DFS may also be used to collect asample of graph nodes. However, incomplete DFS, similarly to incompleteBFS, isbiased towards nodes of highdegree.

Example

[edit]
Animated example of a depth-first search

For the following graph:

An undirected graph with edges AB, BD, BF, FE, AC, CG, AE

a depth-first search starting at the node A, assuming that the left edges in the shown graph are chosen before right edges, and assuming the search remembers previously visited nodes and will not repeat them (since this is a small graph), will visit the nodes in the following order: A, B, D, F, E, C, G. The edges traversed in this search form aTrémaux tree, a structure with important applications ingraph theory.Performing the same search without remembering previously visited nodes results in visiting the nodes in the order A, B, D, F, E, A, B, D, F, E, etc. forever, caught in the A, B, D, F, E cycle and never reaching C or G.

Iterative deepening is one technique to avoid this infinite loop and would reach all nodes.

Output of a depth-first search

[edit]
The four types of edges defined by a spanning tree

The result of a depth-first search of a graph can be conveniently described in terms of aspanning tree of the vertices reached during the search. Based on this spanning tree, the edges of the original graph can be divided into three classes:forward edges, which point from a node of the tree to one of its descendants,back edges, which point from a node to one of its ancestors, andcross edges, which do neither. Sometimestree edges, edges which belong to the spanning tree itself, are classified separately from forward edges. If the original graph is undirected then all of its edges are tree edges or back edges.

Vertex orderings

[edit]

It is also possible to use depth-first search to linearly order the vertices of a graph or tree. There are four possible ways of doing this:

  • Apreordering is a list of the vertices in the order that they were first visited by the depth-first search algorithm. This is a compact and natural way of describing the progress of the search, as was done earlier in this article. A preordering of anexpression tree is the expression inPolish notation.
  • Apostordering is a list of the vertices in the order that they werelast visited by the algorithm. A postordering of an expression tree is the expression inreverse Polish notation.
  • Areverse preordering is the reverse of a preordering, i.e. a list of the vertices in the opposite order of their first visit. Reverse preordering is not the same as postordering.
  • Areverse postordering is the reverse of a postordering, i.e. a list of the vertices in the opposite order of their last visit. Reverse postordering is not the same as preordering.

Forbinary trees there is additionallyin-ordering andreverse in-ordering.

For example, when searching the directed graph below beginning at node A, the sequence of traversals is either A B D B A C A or A C D C A B A (choosing to first visit B or C from A is up to the algorithm). Note that repeat visits in the form of backtracking to a node, to check if it has still unvisited neighbors, are included here (even if it is found to have none). Thus the possible preorderings are A B D C and A C D B, while the possible postorderings are D B C A and D C B A, and the possible reverse postorderings are A C B D and A B C D.

A directed graph with edges AB, BD, AC, CD

Reverse postordering produces atopological sorting of anydirected acyclic graph. This ordering is also useful incontrol-flow analysis as it often represents a natural linearization of the control flows. The graph above might represent the flow of control in the code fragment below, and it is natural to consider this code in the order A B C D or A C B D but not natural to use the order A B D C or A C D B.

if (A) then {B} else {C}D

Pseudocode

[edit]

A recursive implementation of DFS:[5]

procedure DFS(G,v)is    labelv as discoveredfor all directed edges fromv tow that areinG.adjacentEdges(v)doif vertexw is not labeled as discoveredthen            recursively call DFS(G,w)

A non-recursive implementation of DFS with worst-case space complexityO(|E|){\displaystyle O(|E|)}, with the possibility of duplicate vertices on the stack:[6]

procedure DFS_iterative(G,v)is    letS be a stackS.push(v)whileS is not emptydov =S.pop()ifv is not labeled as discoveredthen            labelv as discoveredfor all edges fromv towinG.adjacentEdges(v)doS.push(w)
An undirected graph with edges AB, BD, BF, FE, AC, CG, AE
The example graph, copied from above

These two variations of DFS visit the neighbors of each vertex in the opposite order from each other: the first neighbor ofv visited by the recursive variation is the first one in the list of adjacent edges, while in the iterative variation the first visited neighbor is the last one in the list of adjacent edges. The recursive implementation will visit the nodes from the example graph in the following order: A, B, D, F, E, C, G. The non-recursive implementation will visit the nodes as: A, E, F, B, D, C, G.

The non-recursive implementation is similar tobreadth-first search but differs from it in two ways:

  1. it uses a stack instead of a queue, and
  2. it delays checking whether a vertex has been discovered until the vertex is popped from the stack rather than making this check before adding the vertex.

IfG is atree, replacing the queue of the 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.[7]

Another possible implementation of iterative depth-first search uses a stack ofiterators of the list of neighbors of a node, instead of a stack of nodes. This yields the same traversal as recursive DFS.[8]

procedure DFS_iterative(G,v)is    letS be a stack    labelv as discoveredS.push(iterator ofG.adjacentEdges(v))whileS is not emptydoifS.peek().hasNext()thenw =S.peek().next()ifw is not labeled as discoveredthen                labelw as discoveredS.push(iterator ofG.adjacentEdges(w))elseS.pop()

Applications

[edit]
Randomized algorithm similar to depth-first search used in generating a maze.

Algorithms that use depth-first search as a building block include:

Complexity

[edit]

Thecomputational complexity of DFS was investigated byJohn Reif. More precisely, given a graphG{\displaystyle G}, letO=(v1,,vn){\displaystyle O=(v_{1},\dots ,v_{n})} be the ordering computed by the standard recursive DFS algorithm. This ordering is called the lexicographic depth-first search ordering. John Reif considered the complexity of computing the lexicographic depth-first search ordering, given a graph and a source. Adecision version of the problem (testing whether some vertexu occurs before some vertexv in this order) isP-complete,[12] meaning that it is "a nightmare forparallel processing".[13]: 189 

A depth-first search ordering (not necessarily the lexicographic one), can be computed by a randomized parallel algorithm in the complexity classRNC.[14] As of 1997, it remained unknown whether a depth-first traversal could be constructed by a deterministic parallel algorithm, in the complexity classNC.[15]

See also

[edit]

Notes

[edit]
  1. ^Charles Pierre Trémaux (1859–1882) École polytechnique of Paris (X:1876), French engineer of the telegraph
    in Public conference, December 2, 2010 – by professorJean Pelletier-Thibert in Académie de Macon (Burgundy – France) – (Abstract published in the Annals academic, March 2011 –ISSN 0980-6032)
  2. ^Even, Shimon (2011),Graph Algorithms (2nd ed.), Cambridge University Press, pp. 46–48,ISBN 978-0-521-73653-4.
  3. ^Sedgewick, Robert (2002),Algorithms in C++: Graph Algorithms (3rd ed.), Pearson Education,ISBN 978-0-201-36118-6.
  4. ^ Cormen, Thomas H., Charles E. Leiserson, and Ronald L. Rivest. p.606
  5. ^Goodrich and Tamassia; Cormen, Leiserson, Rivest, and Stein
  6. ^Page 93, Algorithm Design, Kleinberg and Tardos
  7. ^"Stack-based graph traversal ≠ depth first search".11011110.github.io. Retrieved2020-06-10.
  8. ^Sedgewick, Robert (2010).Algorithms in Java. Addison-Wesley.ISBN 978-0-201-36121-6.OCLC 837386973.
  9. ^Hopcroft, John;Tarjan, Robert E. (1974),"Efficient planarity testing"(PDF),Journal of the Association for Computing Machinery,21 (4):549–568,doi:10.1145/321850.321852,hdl:1813/6011,S2CID 6279825.
  10. ^de Fraysseix, H.;Ossona de Mendez, P.;Rosenstiehl, P. (2006), "Trémaux Trees and Planarity",International Journal of Foundations of Computer Science,17 (5):1017–1030,arXiv:math/0610935,Bibcode:2006math.....10935D,doi:10.1142/S0129054106004248,S2CID 40107560.
  11. ^Baccelli, Francois; Haji-Mirsadeghi, Mir-Omid; Khezeli, Ali (2018), "Eternal family trees and dynamics on unimodular random graphs", in Sobieczky, Florian (ed.),Unimodularity in Randomly Generated Graphs: AMS Special Session, October 8–9, 2016, Denver, Colorado, Contemporary Mathematics, vol. 719, Providence, Rhode Island: American Mathematical Society, pp. 85–127,arXiv:1608.05940,doi:10.1090/conm/719/14471,ISBN 978-1-4704-3914-9,MR 3880014,S2CID 119173820; seeExample 3.7, p. 93
  12. ^Reif, John H. (1985). "Depth-first search is inherently sequential".Information Processing Letters.20 (5):229–234.doi:10.1016/0020-0190(85)90024-9.
  13. ^Mehlhorn, Kurt;Sanders, Peter (2008).Algorithms and Data Structures: The Basic Toolbox(PDF). Springer.Archived(PDF) from the original on 2015-09-08.
  14. ^Aggarwal, A.; Anderson, R. J. (1988), "A randomNC algorithm for depth first search",Combinatorica,8 (1):1–12,doi:10.1007/BF02122548,MR 0951989,S2CID 29440871.
  15. ^Karger, David R.;Motwani, Rajeev (1997), "AnNC algorithm for minimum cuts",SIAM Journal on Computing,26 (1):255–272,CiteSeerX 10.1.1.33.1701,doi:10.1137/S0097539794273083,MR 1431256.

References

[edit]

External links

[edit]
Wikimedia Commons has media related toDepth-first search.
Graph andtree traversal algorithms
Search
Shortest path
Minimum spanning tree
Retrieved from "https://en.wikipedia.org/w/index.php?title=Depth-first_search&oldid=1283674521"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp