深度與廣度優(yōu)先搜索

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

基本思想

深度優(yōu)先搜索,從起點(diǎn)出發(fā),從規(guī)定的方向中選擇其中一個(gè)不斷地向前走,直到無(wú)法繼續(xù)為止,然后嘗試另外一種方向,直到最后走到終點(diǎn)。就像走迷宮一樣,盡量往深處走。
DFS 解決的是連通性的問(wèn)題,即,給定兩個(gè)點(diǎn),一個(gè)是起始點(diǎn),一個(gè)是終點(diǎn),判斷是不是有一條路徑能從起點(diǎn)連接到終點(diǎn)。起點(diǎn)和終點(diǎn),也可以指的是某種起始狀態(tài)和最終的狀態(tài)。問(wèn)題的要求并不在乎路徑是長(zhǎng)還是短,只在乎有還是沒(méi)有。有時(shí)候題目也會(huì)要求把找到的路徑完整的打印出來(lái)。

廣度優(yōu)先搜索(Breadth-First Search / BFS)

基本思想

廣度優(yōu)先搜索,一般用來(lái)解決最短路徑的問(wèn)題。和深度優(yōu)先搜索不同,廣度優(yōu)先的搜索是從起始點(diǎn)出發(fā),一層一層地進(jìn)行,每層當(dāng)中的點(diǎn)距離起始點(diǎn)的步數(shù)都是相同的,當(dāng)找到了目的地之后就可以立即結(jié)束。
廣度優(yōu)先的搜索可以同時(shí)從起始點(diǎn)和終點(diǎn)開(kāi)始進(jìn)行,稱之為雙端 BFS。這種算法往往可以大大地提高搜索的效率。

代碼實(shí)現(xiàn)

假設(shè)我們有這么一個(gè)圖,里面有A、B、C、D、E、F、G、H 8 個(gè)頂點(diǎn),點(diǎn)和點(diǎn)之間的聯(lián)系如下圖所示,對(duì)這個(gè)圖進(jìn)行深度優(yōu)先和廣度優(yōu)先的遍歷。


from collections import deque

class Solution:
    def __init__(self):
        self.graph = {}
        self.graph['A'] = ['B','D','G']
        self.graph['B'] = ['A','E','F']
        self.graph['C'] = ['F','H']
        self.graph['D'] = ['A','F']
        self.graph['E'] = ['B','G']
        self.graph['F'] = ['B','C','D']
        self.graph['G'] = ['A','E']
        self.graph['H'] = ['C']
        
        self.done = {}
        self.done['A'] = 1
        self.done['B'] = 1
        self.done['C'] = 1
        self.done['D'] = 1
        self.done['E'] = 1
        self.done['F'] = 1
        self.done['G'] = 1
        self.done['H'] = 1
        
    def DFS(self):
        stack = []
        stack.append('A')
        self.done['A'] = 0
        print('已經(jīng)訪問(wèn)過(guò)A!')
        
        while stack:
            t = 0
            for i in self.graph[stack[-1]]:
                t += self.done[i]
            if t == 0:
                stack.pop()
                continue
            
            for i in self.graph[stack[-1]]:
                if self.done[i]:
                    self.done[i] = 0
                    stack.append(i)
                    print('已經(jīng)訪問(wèn)過(guò)'+i+'!')
                    print(stack)
                    break
        print('遍歷完成')
    
    def BFS(self):
        queue = deque()
        queue.append('A')
        self.done['A'] = 0
        print('已經(jīng)訪問(wèn)過(guò)A!')
        
        while queue:
            for i in self.graph[queue.popleft()]:
                if self.done[i]:
                    self.done[i] = 0
                    queue.append(i)
                    print('已經(jīng)訪問(wèn)過(guò)'+i+'!')
                    print(queue)

            
if __name__ == '__main__':
    s = Solution()
    s.BFS()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.如何分析一個(gè)排序算法 1.排序算法的執(zhí)行效率 最好情況,最壞情況,平均情況時(shí)間復(fù)雜度以及對(duì)應(yīng)的要排序的原始數(shù)據(jù)...
    學(xué)海一烏鴉閱讀 131評(píng)論 0 1
  • 題目描述 給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度。不要使...
    珺王不早朝閱讀 263評(píng)論 0 0
  • 算法思想貪心思想雙指針排序快速選擇堆排序桶排序荷蘭國(guó)旗問(wèn)題二分查找搜索BFSDFSBacktracking分治動(dòng)態(tài)...
    第六象限閱讀 4,908評(píng)論 0 0
  • 排序 分析排序算法的3大指標(biāo)有哪些,對(duì)應(yīng)適用場(chǎng)景? 執(zhí)行效率時(shí)間復(fù)雜度比較和交換的次數(shù)內(nèi)存消耗--空間復(fù)雜度原地排...
    竹blue閱讀 265評(píng)論 0 0
  • 《程序員代碼面試指南-左程云》筆記 第一章 棧和隊(duì)列 設(shè)計(jì)一個(gè)有g(shù)etMin功能的棧 實(shí)現(xiàn)一個(gè)特殊的棧,在實(shí)現(xiàn)棧的...
    xiaogmail閱讀 18,741評(píng)論 2 19

友情鏈接更多精彩內(nèi)容