【譯】Swift算法俱樂部-深度優(yōu)先搜索

本文是對(duì) Swift Algorithm Club 翻譯的一篇文章啄寡。
Swift Algorithm Clubraywenderlich.com網(wǎng)站出品的用Swift實(shí)現(xiàn)算法和數(shù)據(jù)結(jié)構(gòu)的開源項(xiàng)目,目前在GitHub上有18000+??另患,我初略統(tǒng)計(jì)了一下,大概有一百左右個(gè)的算法和數(shù)據(jù)結(jié)構(gòu)降铸,基本上常見的都包含了住拭,是iOSer學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)不錯(cuò)的資源。
??andyRon/swift-algorithm-club-cn是我對(duì)Swift Algorithm Club柱嫌,邊學(xué)習(xí)邊翻譯的項(xiàng)目锋恬。由于能力有限,如發(fā)現(xiàn)錯(cuò)誤或翻譯不妥编丘,請(qǐng)指正与学,歡迎pull request。也歡迎有興趣嘉抓、有時(shí)間的小伙伴一起參與翻譯和學(xué)習(xí)??索守。當(dāng)然也歡迎加??,??????????抑片。
本文的翻譯原文和代碼可以查看??swift-algorithm-club-cn/Depth-First Search


深度優(yōu)先搜索(DFS卵佛,Depth-First Search)

這個(gè)主題已經(jīng)有輔導(dǎo)文章

深度優(yōu)先搜索(DFS)是用于遍歷或搜索數(shù)據(jù)結(jié)構(gòu)的算法。它從源節(jié)點(diǎn)開始,并在回溯之前盡可能地沿著每個(gè)分支進(jìn)行探索截汪。

深度優(yōu)先搜索可以用于有向圖和無向圖疾牲。

動(dòng)畫示例

以下是深度優(yōu)先搜索在圖上的工作方式:

Animated example

假設(shè)我們從節(jié)點(diǎn)A開始搜索。 在深度優(yōu)先搜索中衙解,我們查看起始節(jié)點(diǎn)的第一個(gè)鄰居并訪問它阳柔,在這個(gè)示例中是節(jié)點(diǎn)B。然后我們查找節(jié)點(diǎn)B的第一個(gè)鄰居并訪問它蚓峦,它是節(jié)點(diǎn)D舌剂。由于D沒有自己的任何未訪問的鄰居節(jié)點(diǎn),我們回溯到節(jié)點(diǎn)B并轉(zhuǎn)到其另外的鄰居節(jié)點(diǎn)E暑椰。依此類推霍转,直到我們?cè)L問了圖中的所有節(jié)點(diǎn)。

每當(dāng)我們?cè)L問第一個(gè)鄰居節(jié)點(diǎn)并繼續(xù)前進(jìn)干茉,直到無處可去谴忧,然后我們回溯到之前訪問的節(jié)點(diǎn)。 當(dāng)我們一直回溯到節(jié)點(diǎn)A時(shí)角虫,搜索就完成了沾谓。

對(duì)于上面的例子,是按照A戳鹅,B均驶,DE枫虏,H妇穴,FG隶债,C的順序訪問節(jié)點(diǎn)的腾它。

深度優(yōu)先搜索過程也可以顯示為樹:

Traversal tree

節(jié)點(diǎn)的父節(jié)點(diǎn)是“發(fā)現(xiàn)”該節(jié)點(diǎn)的節(jié)點(diǎn)。 樹的根是您開始深度優(yōu)先搜索的節(jié)點(diǎn)死讹。 每當(dāng)有一個(gè)分支時(shí)瞒滴,那就是我們回溯的地方。

代碼

深度優(yōu)先搜索的簡單遞歸實(shí)現(xiàn):

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
}

廣度優(yōu)先搜索首先訪問所有直接鄰居赞警,而深度優(yōu)先搜索嘗試盡可能地深入樹或圖妓忍。

在 playground 里測(cè)試:

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)

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

DFS有什么用?

深度優(yōu)先搜索可用于解決許多問題愧旦,例如:

作者:Paulo Tanaka,Matthijs Hollemans
翻譯:Andy Ron
校對(duì):Andy Ron

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笤虫,一起剝皮案震驚了整個(gè)濱河市旁瘫,隨后出現(xiàn)的幾起案子祖凫,更是在濱河造成了極大的恐慌,老刑警劉巖酬凳,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝙场,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡粱年,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門罚拟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來台诗,“玉大人,你說我怎么就攤上這事赐俗±樱” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵阻逮,是天一觀的道長粱快。 經(jīng)常有香客問我,道長叔扼,這世上最難降的妖魔是什么事哭? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮瓜富,結(jié)果婚禮上鳍咱,老公的妹妹穿的比我還像新娘。我一直安慰自己与柑,他們只是感情好谤辜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著价捧,像睡著了一般丑念。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上结蟋,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天脯倚,我揣著相機(jī)與錄音,去河邊找鬼椎眯。 笑死挠将,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的编整。 我是一名探鬼主播舔稀,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼掌测!你這毒婦竟也來了内贮?” 一聲冷哼從身側(cè)響起产园,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夜郁,沒想到半個(gè)月后什燕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竞端,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年屎即,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片事富。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡技俐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出统台,到底是詐尸還是另有隱情雕擂,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布贱勃,位于F島的核電站井赌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贵扰。R本人自食惡果不足惜仇穗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拔鹰。 院中可真熱鬧仪缸,春花似錦、人聲如沸列肢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓷马。三九已至拴还,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欧聘,已是汗流浹背片林。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怀骤,地道東北人费封。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像蒋伦,于是被迫代替她去往敵國和親弓摘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容