本文是對 Swift Algorithm Club 翻譯的一篇文章。
Swift Algorithm Club是 raywenderlich.com網站出品的用Swift實現算法和數據結構的開源項目,目前在GitHub上有18000+⭐️,我初略統計了一下,大概有一百左右個的算法和數據結構,基本上常見的都包含了,是iOSer學習算法和數據結構不錯的資源。
🐙andyRon/swift-algorithm-club-cn是我對Swift Algorithm Club,邊學習邊翻譯的項目。因爲能力有限,如發現錯誤或翻譯不妥,請指正,歡迎pull request。也歡迎有興趣、有時間的小夥伴一塊兒參與翻譯和學習🤓。固然也歡迎加⭐️,🤩🤩🤩🤨🤪。
本文的翻譯原文和代碼能夠查看🐙swift-algorithm-club-cn/Depth-First Searchnode
這個主題已經有輔導文章git
深度優先搜索(DFS)是用於遍歷或搜索樹或圖數據結構的算法。它從源節點開始,並在回溯以前儘量地沿着每一個分支進行探索。github
深度優先搜索能夠用於有向圖和無向圖。算法
如下是深度優先搜索在圖上的工做方式:swift
假設咱們從節點A
開始搜索。 在深度優先搜索中,咱們查看起始節點的第一個鄰居並訪問它,在這個示例中是節點B
。而後咱們查找節點B
的第一個鄰居並訪問它,它是節點D
。因爲D
沒有本身的任何未訪問的鄰居節點,咱們回溯到節點B
並轉到其另外的鄰居節點E
。依此類推,直到咱們訪問了圖中的全部節點。數據結構
每當咱們訪問第一個鄰居節點並繼續前進,直到無處可去,而後咱們回溯到以前訪問的節點。 當咱們一直回溯到節點A
時,搜索就完成了。學習
對於上面的例子,是按照A
,B
,D
,E
,H
,F
,G
,C
的順序訪問節點的。測試
深度優先搜索過程也能夠顯示爲樹:動畫
節點的父節點是「發現」該節點的節點。 樹的根是您開始深度優先搜索的節點。 每當有一個分支時,那就是咱們回溯的地方。網站
深度優先搜索的簡單遞歸實現:
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"]
深度優先搜索可用於解決許多問題,例如: