图——深度优先搜索(Graph - Depth First Search)


简介(Introduction)
Depth-first search(DFS) is an algorithm for traversing or searching tree or graph data structure. One starts at the root(selecting some arbitrary node as the root in the case of a graph) and explores as far as possible along each branch before backtracking.

示例(Example)
这里写图片描述
DFS order: a, b, d, e, c, f, g.

检索栈(The Traversal Stack)
We can use a traversal stack to track where we are in overall process.
这里写图片描述

Push order: a, b, d, e, c, f, g.
Pop order: e, d, b, c, a, g, f.

Push nodes into stack when visiting. Pop nodes as all of its neighbours are visited.

Actually, pushing-order gives us node-visiting order which is DFS order. Poping-order gives us backtracking path.

搜索树(DFS Tree)
We can draw DFS tree(forest) to depict DF-traversal.
这里写图片描述

算法(Algorithm Pseudocode)

function DFS(<V, E>)
    mark each node in V with 0
    count ⟵ 0
    for each v in V do
        if v is marked with 0 then
            DFSExplore(v)

function DFSExplore(v)
    count ⟵ count + 1
    mark v with count
    for each edge (v, w) do
        if w is marked with 0 then
            DFSExplore(w)

时间复杂度(Time Complexity)
We can implement marking nodes by maintaining an array mark[] indexed by V. For example, “mark v with count” = “mark[v] = count”. The value of count represents the order number visited. For instance, “mark[v] = 3”. It means node v is the third node visited.

If we use adjacency matrix to represent a graph. The time for finding each edge (v, w) is |V|^2. Hence the complexity of graph traversal is (|V| + |V|^2), which is Θ(|V|^2).

If using adjacency list, for each v we traverse the list adj[v] to find all its neighbour. It will take |E| times. overall, its time complexity is Θ(|V| + |E|).

问题(Questions)
Based on the algorithm, answer those following questions.
1. How to decide whether a graph is connected?
2. how to decide whether a graph has a cycle?
3. In terms of DFS tree(forest), how can we tell if we have traversed a dag.

写在后面的话(PS)
DFS is a great tree traversal and searching technique.

Ask yourself, what practical problems can we solve using DFS? Give specific example.

Welcome questions always and forever.

发布了37 篇原创文章 · 获赞 2 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览