1. 程式人生 > >圖的遍歷之深度優先和廣度優先

圖的遍歷之深度優先和廣度優先

優先 ges sky 深度優先 們的 老師 ear blog earch

圖的遍歷之深度優先和廣度優先

深度優先遍歷

  • 假設給定圖G的初態是所有頂點均未曾訪問過。在G中任選一頂點v為初始出發點(源點),則深度優先遍歷可定義如下:首先訪問出發點v,並將其標記為已訪問過;然後依次從v出發搜索v的每個鄰接點w。若w未曾訪問過,則以w為新的出發點繼續進行深度優先遍歷,直至圖中所有和源點v有路徑相通的頂點(亦稱為從源點可達的頂點)均已被訪問為止。若此時圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作為新的源點重復上述過程,直至圖中所有頂點均已被訪問為止。

  • 圖的深度優先遍歷類似於樹的前序遍歷。采用的搜索方法的特點是盡可能先對縱深方向進行搜索。這種搜索方法稱為深度優先搜索(Depth-First Search)。相應地,用此方法遍歷圖就很自然地稱之為圖的深度優先遍歷。

  • 基本實現思想:
    • (1)訪問頂點v;
    • (2)從v的未被訪問的鄰接點中選取一個頂點w,從w出發進行深度優先遍歷;
    • (3)重復上述兩步,直至圖中所有和v有路徑相通的頂點都被訪問到。

技術分享

  • 深度優先的順序:
    • 以A為頂點:ABCE-D
    • 以B為頂點:BCE-D-A
    • 以C為頂點:CE-BD-A
    • 以D為頂點:DCE-AB
    • 以E為頂點:E-ABC-D

廣度優先遍歷

  • 圖的廣度優先遍歷BFS算法是一個分層搜索的過程,和樹的層序遍歷算法類同,它也需要一個隊列以保持遍歷過的頂點順序,以便按出隊的順序再去訪問這些頂點的鄰接頂點。

  • 基本思想:從圖中某頂點v出發,在訪問了v之後依次訪問v的各個未曾訪問過的鄰接點,然後分別從這些鄰接點出發依次訪問它們的鄰接點,並使得“先被訪問的頂點的鄰接點先於後被訪問的頂點的鄰接點被訪問,直至圖中所有已被訪問的頂點的鄰接點都被訪問到。如果此時圖中尚有頂點未被訪問,則需要另選一個未曾被訪問過的頂點作為新的起始點,重復上述過程,直至圖中所有頂點都被訪問到為止。

技術分享

  • 廣度優先的順序:
    • 以A為頂點:ABDEC
    • 以B為頂點:BCDAE
    • 以C為頂點:CEABD
    • 以D為頂點:DCEAB
    • 以E為頂點:EABDC

感想

  • 在課堂上的時候沒有完全消化老師所講的內容,通過課後的學習將這兩種遍歷方法搞明白了。

參考

  • 深度優先遍歷與廣度優先遍歷
  • 圖的遍歷之 深度優先搜索和廣度優先搜索

圖的遍歷之深度優先和廣度優先