【譯】Swift算法俱樂部-深度優先搜索

本文是對 Swift Algorithm Club 翻譯的一篇文章。
Swift Algorithm Clubraywenderlich.com網站出品的用Swift實現算法和數據結構的開源項目,目前在GitHub上有18000+⭐️,我初略統計了一下,大概有一百左右個的算法和數據結構,基本上常見的都包含了,是iOSer學習算法和數據結構不錯的資源。
🐙andyRon/swift-algorithm-club-cn是我對Swift Algorithm Club,邊學習邊翻譯的項目。因爲能力有限,如發現錯誤或翻譯不妥,請指正,歡迎pull request。也歡迎有興趣、有時間的小夥伴一塊兒參與翻譯和學習🤓。固然也歡迎加⭐️,🤩🤩🤩🤨🤪。
本文的翻譯原文和代碼能夠查看🐙swift-algorithm-club-cn/Depth-First Searchnode


深度優先搜索(DFS,Depth-First Search)

這個主題已經有輔導文章git

深度優先搜索(DFS)是用於遍歷或搜索數據結構的算法。它從源節點開始,並在回溯以前儘量地沿着每一個分支進行探索。github

深度優先搜索能夠用於有向圖和無向圖。算法

動畫示例

如下是深度優先搜索在圖上的工做方式:swift

Animated example

假設咱們從節點A開始搜索。 在深度優先搜索中,咱們查看起始節點的第一個鄰居並訪問它,在這個示例中是節點B。而後咱們查找節點B的第一個鄰居並訪問它,它是節點D。因爲D沒有本身的任何未訪問的鄰居節點,咱們回溯到節點B並轉到其另外的鄰居節點E。依此類推,直到咱們訪問了圖中的全部節點。數據結構

每當咱們訪問第一個鄰居節點並繼續前進,直到無處可去,而後咱們回溯到以前訪問的節點。 當咱們一直回溯到節點A時,搜索就完成了。學習

對於上面的例子,是按照ABDEHFGC的順序訪問節點的。測試

深度優先搜索過程也能夠顯示爲樹:動畫

Traversal tree

節點的父節點是「發現」該節點的節點。 樹的根是您開始深度優先搜索的節點。 每當有一個分支時,那就是咱們回溯的地方。網站

代碼

深度優先搜索的簡單遞歸實現:

func depthFirstSearch(_ graph: Graph, source: Node) -> [String] {
  var nodesExplored = [source.label]
  source.visited = true

  for edge in source.neighbors {
    if !edge.neighbor.visited {
      nodesExplored += depthFirstSearch(graph, source: edge.neighbor)
    }
  }
  return nodesExplored
}
複製代碼

廣度優先搜索首先訪問全部直接鄰居,而深度優先搜索嘗試儘量地深刻樹或圖。

在 playground 裏測試:

let graph = Graph()

let nodeA = graph.addNode("a")
let nodeB = graph.addNode("b")
let nodeC = graph.addNode("c")
let nodeD = graph.addNode("d")
let nodeE = graph.addNode("e")
let nodeF = graph.addNode("f")
let nodeG = graph.addNode("g")
let nodeH = graph.addNode("h")

graph.addEdge(nodeA, neighbor: nodeB)
graph.addEdge(nodeA, neighbor: nodeC)
graph.addEdge(nodeB, neighbor: nodeD)
graph.addEdge(nodeB, neighbor: nodeE)
graph.addEdge(nodeC, neighbor: nodeF)
graph.addEdge(nodeC, neighbor: nodeG)
graph.addEdge(nodeE, neighbor: nodeH)
graph.addEdge(nodeE, neighbor: nodeF)
graph.addEdge(nodeF, neighbor: nodeG)

let nodesExplored = depthFirstSearch(graph, source: nodeA)
print(nodesExplored)
複製代碼

打印結果是: ["a", "b", "d", "e", "h", "f", "g", "c"]

DFS有什麼用?

深度優先搜索可用於解決許多問題,例如:

  • 查找稀疏圖的連通份量
  • 圖中節點的拓撲排序
  • 查找圖的橋樑(參見:Bridges
  • 還有不少其它應用!

做者:Paulo Tanaka,Matthijs Hollemans
翻譯:Andy Ron
校對:Andy Ron

相關文章
相關標籤/搜索