26考研——圖_圖的遍歷(6)

408答疑


文章目錄

  • 三、圖的遍歷
    • 圖的遍歷概述
      • 圖的遍歷算法的重要性
      • 圖的遍歷與樹的遍歷的區別
      • 圖的遍歷過程中的注意事項
        • 避免重復訪問
        • 遍歷算法的分類
        • 遍歷結果的不唯一性
    • 廣度優先搜索
      • 廣度優先搜索(BFS)概述
      • BFS 的特點
      • 廣度優先遍歷的過程
        • 示例圖
        • 遍歷過程
      • BFS 算法的性能分析
        • 基于鄰接表存儲的 BFS 的效率
      • BFS 算法求解單源最短路徑問題
      • 廣度優先生成樹
    • 深度優先搜索
      • 深度優先搜索(DFS)概述
      • 深度優先遍歷的過程
        • 示例圖
        • 遍歷過程
      • DFS 算法的性能分析
      • 深度優先的生成樹和生成森林
    • 注意事項
    • 圖的遍歷與圖的連通性
  • 六、參考資料
    • 鮑魚科技課件
    • 26王道考研書


三、圖的遍歷

圖的遍歷概述

圖的遍歷是指從圖中的某一項點出發,按照某種搜索方法沿著圖中的邊對圖中的所有頂點訪問一次,且僅訪問一次。
注意到樹是一種特殊的圖,所以樹的遍歷實際上也可視為一種特殊的圖的遍歷。

圖的遍歷算法的重要性

圖的遍歷算法是求解圖的連通性問題、拓撲排序和求關鍵路徑等算法的基礎。

圖的遍歷與樹的遍歷的區別

圖的遍歷比樹的遍歷要復雜得多,因為圖的任意一個頂點都可能和其余的頂點相鄰接,所以在訪問某個頂點后,可能沿著某條路徑搜索又回到該頂點。

圖的遍歷過程中的注意事項

避免重復訪問

為避免同一頂點被訪問多次,在遍歷圖的過程中,必須記下每個已訪問過的頂點,為此可以設一個輔助數組 visited[] 來標記頂點是否被訪問過。

遍歷算法的分類

圖的遍歷算法主要有兩種:

  • 廣度優先搜索(BFS)
  • 深度優先搜索(DFS)
遍歷結果的不唯一性

圖的遍歷結果順序是不唯一的,跟選擇的起始結點和所求鄰接結點的順序有關。

廣度優先搜索

廣度優先搜索(BFS)概述

廣度優先搜索(Breadth-First-Search, BFS)類似于二叉樹的層次遍歷算法。基本思想是:首先訪問起始頂點 v v v,接著由 v v v 出發,依次訪問 v v v 的各個未訪問過的鄰接頂點 w 1 , w 2 , ? , w r w_1, w_2, \cdots, w_r w1?,w2?,?,wr?,然后依次訪問 w 1 , w 2 , ? , w r w_1, w_2, \cdots, w_r w1?,w2?,?,wr? 的所有未被訪問過的鄰接頂點;再從這些訪問過的頂點出發,訪問它們所有未被訪問過的鄰接頂點,直至圖中所有頂點都被訪問過為止。若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作為始點,重復上述過程,直至圖中所有頂點都被訪問到為止。Dijkstra 單源最短路徑算法和 Prim 最小生成樹算法也應用了類似的思想。

BFS 的特點

廣度優先搜索遍歷圖的過程是以 v v v 為起始點,由近至遠依次訪問和 v v v 有路徑相通且路徑長度為 1, 2, … 的頂點。廣度優先搜索是一種分層的查找過程,每向前走一步可能訪問一批頂點,不像深度優先搜索那樣有往回退的情況,因此它不是一個遞歸的算法。為了實現逐層的訪問,算法必須借助一個輔助隊列,以記憶正在訪問的頂點的下一層頂點。

廣度優先遍歷的過程

示例圖

如下圖所示,一個無向圖 G G G

在這里插入圖片描述

遍歷過程

假設從頂點 a a a 開始訪問, a a a 先入隊。此時隊列非空,取出隊頭元素 a a a,因為 b , c b, c b,c a a a 鄰接且未被訪問過,于是依次訪問 b , c b, c b,c,并將 b , c b, c b,c 依次入隊。隊列非空,取出隊頭元素 b b b,依次訪問與 b b b 鄰接且未被訪問的頂點 d , e d, e d,e,并將 d , e d, e d,e 入隊(注意: a a a b b b 也鄰接,但 a a a 已置訪問標記,所以不再重復訪問)。此時隊列非空,取出隊頭元素 c c c,訪問與 c c c 鄰接且未被訪問的頂點 f , g f, g f,g,并將 f , g f, g f,g 入隊。此時,取出隊頭元素 d d d,但與 d d d 鄰接且未被訪問的頂點為空,所以不進行任何操作。繼續取出隊頭元素 e e e,將 h h h 入隊列……最終取出隊頭元素 h h h 后,隊列為空,從而循環自動跳出。遍歷結果為 a b c d e f g h abcdefgh abcdefgh

從上例不難看出,圖的廣度優先搜索的過程與二叉樹的層次遍歷是完全一致的,這也說明了圖的廣度優先搜索遍歷算法是二叉樹的層次遍歷算法的擴展。

BFS 算法的性能分析

無論是鄰接表還是鄰接矩陣的存儲方式,BFS 算法都需要借助一個輔助隊列 Q Q Q n n n 個頂點均需入隊一次,在最壞的情況下,空間復雜度為 O ( ∣ V ∣ ) O(|V|) O(V)

基于鄰接表存儲的 BFS 的效率

遍歷圖的過程實質上是對每個頂點查找其鄰接點的過程,耗費的時間取決于所采用的存儲結構。采用鄰接表存儲時,每個頂點均需搜索(或入隊)一次,時間復雜度為 O ( ∣ V ∣ ) O(|V|) O(V),在搜索每個頂點的鄰接點時,每條邊至少訪問一次,時間復雜度為 O ( ∣ E ∣ ) O(|E|) O(E),總的時間復雜度為 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E)。采用鄰接矩陣存儲時,查找每個頂點的鄰接點所需的時間為 O ( ∣ V ∣ ) O(|V|) O(V),總時間復雜度為 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)

BFS 算法求解單源最短路徑問題

若圖 G = ( V , E ) G = (V, E) G=(V,E) 為非帶權圖,定義從頂點 u u u 到頂點 v v v 的最短路徑 d ( u , v ) d(u, v) d(u,v) 為從 u u u v v v 的任何路徑中最少的邊數;若從 u u u v v v 沒有通路,則 d ( u , v ) = ∞ d(u, v) = \infty d(u,v)=

使用 BFS,我們可以求解一個滿足上述定義的非帶權圖的單源最短路徑問題,這是由廣度優先搜索總是按照距離由近到遠來遍歷圖中每個頂點的性質決定的。

廣度優先生成樹

在廣度遍歷的過程中,我們可以得到一棵遍歷樹,稱為廣度優先生成樹,如下圖所示。

在這里插入圖片描述

需要注意的是,同一個圖的鄰接矩陣存儲表示是唯一的,所以其廣度優先生成樹也是唯一的,但因為鄰接表存儲表示不唯一,所以其廣度優先生成樹也是不唯一的。

深度優先搜索

深度優先搜索(DFS)概述

深度優先搜索(Depth-First-Search, DFS)是一種盡可能“深”地搜索圖的算法。其基本思想如下:

  1. 借助臨時空間:借助 n n n 個臨時空間來標記結點是否被訪問過。
  2. 訪問頂點:首先訪問圖中的某一頂點 v v v,接著訪問 v v v 的鄰接頂點 w w w,訪問 w w w 的下一鄰接頂點,依次類推,重復上述過程。
  3. 回溯:當不能再繼續向下訪問頂點時,依次退回到最近被訪問的頂點,如果還有其他鄰接頂點沒有被訪問,則繼續從該結點出發開始上述的遍歷過程,直到圖的所有結點被訪問完為止。

深度優先遍歷相當于二叉樹中的前序遍歷。

深度優先遍歷的過程

示例圖

如下圖所示,一個無向圖 G G G

在這里插入圖片描述

遍歷過程

深度優先搜索的過程如下:

  1. 首先訪問 a a a,并置 a a a 訪問標記。
  2. 然后訪問與 a a a 鄰接且未被訪問的頂點 b b b,置 b b b 訪問標記。
  3. 然后訪問與 b b b 鄰接且未被訪問的頂點 d d d,置 d d d 訪問標記。
  4. 此時 d d d 已沒有未被訪問過的鄰接點,所以返回上一個訪問的頂點 b b b,訪問與其鄰接且未被訪問的頂點 e e e,置 e e e 訪問標記,以此類推,直至圖中所有頂點都被訪問一次。遍歷結果為 a b d e h c f g abdehcfg abdehcfg

DFS 算法的性能分析

DFS算法是一個遞歸算法,需要借助一個遞歸工作棧,所以其空間復雜度為 O ( ∣ V ∣ ) O(|V|) O(V)。遍歷圖的過程實質上是通過邊查找鄰接點的過程,因此兩種遍歷方式的時間復雜度都相同,不同之處僅在于對頂點訪問順序的不同。采用鄰接矩陣存儲時,總時間復雜度為 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)。采用鄰接表存儲時,總的時間復雜度為 O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(V+E)

深度優先的生成樹和生成森林

與廣度優先搜索一樣,深度優先搜索也會產生一棵深度優先生成樹。當然,這是有條件的,即對連通圖調用DFS才能產生深度優先生成樹,否則產生的將是深度優先生成森林,如下圖所示。

在這里插入圖片描述

與BFS類似,基于鄰接表存儲的深度優先生成樹是不唯一的。

注意事項

圖的鄰接矩陣表示是唯一的,但對鄰接表來說,若邊的輸入次序不同,則生成的鄰接表也不同。因此,對同樣一個圖,基于鄰接矩陣的遍歷得到的 DFS 序列和 BFS 序列是唯一的,基于鄰接表的遍歷得到的 DFS 序列和 BFS 序列是不唯一的。

圖的遍歷與圖的連通性

圖的遍歷法可以用來判斷圖的連通性。對于無向圖來說,若無向圖是連通的,則從任意一個結點出發,僅需一次遍歷就能夠訪問圖中的所有頂點;若無向圖是非連通的,則從某一個頂點出發,一次遍歷只能訪問到該頂點所在連通分量的所有頂點,而對于圖中其他連通分量的頂點,則無法通過這次遍歷訪問。對于有向圖來說,若從初始頂點到圖中的每個頂點都有路徑,則能夠訪問到圖中的所有頂點,否則不能訪問到所有頂點。

因此,在BFSTraverse()或DFSTraverse()中添加了第二個for循環,再選取初始點,繼續進行遍歷,以防止一次無法遍歷圖的所有頂點。對于無向圖,上述兩個函數調用BFS(G, i)或DFS(G, i)的次數等于該圖的連通分量數;而對于有向圖則不是這樣,因為一個連通的有向圖分為強連通的和非強連通的,它的連通子圖也分為強連通分量和非強連通分量,非強連通分量一次調用BFS(G, i)或DFS(G, i)無法訪問到該連通分量的所有頂點,如下圖所示。

在這里插入圖片描述

六、參考資料

鮑魚科技課件

b站免費王道課后題講解:
在這里插入圖片描述

網課全程班:
在這里插入圖片描述

26王道考研書

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73447.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73447.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端解決方案:實現網頁截圖并導出PDF功能

前端解決方案:實現網頁截圖并導出PDF功能 在前端開發中,我們經常會遇到需要將網頁內容導出為PDF的需求。本文將以一個準考證預覽和導出的例子,帶你一步步實現這個功能。我們會處理包括跨域圖片、Canvas繪圖、PDF生成等多個技術要點。 一、基…

【MySQL】表操作

表操作 一、創建表 1、語句2、語句介紹3、注意事項4、介紹5、示例 二、查看表結構 1、語句2、介紹3、返回的信息4、示例 三、添加字段 1、語句2、語句介紹3、示例 四、修改 1、語句2、語句介紹3、示例 五、刪除 1、語句2、示例 六、修改表名 1、語句2、語句介紹3、示例 七、刪…

[新聞.AI]國產大模型新突破:阿里開源 Qwen2.5-VL-32B 與 DeepSeek 升級 V3 模型

(本文借助 Deepseek-R1 協助生成) 在2025年3月24日至25日的短短24小時內,中國AI領域迎來兩大重磅開源更新:阿里通義千問團隊發布多模態大模型Qwen2.5-VL-32B-Instruct,而DeepSeek則推出編程能力大幅提升的DeepSeek-V3…

深入剖析C# List<T>的底層實現與性能奧秘

一、動態數組的本質:List的架構設計 在C#的集合類型體系中,List作為最常用的線性數據結構,其核心實現基于動態數組機制。與傳統數組不同,List通過智能的容量管理策略,在保持數組高速隨機訪問優勢的同時,突…

【單元測試】

一、框架 不同的編程語言有不同的測試框架,以下是一些常見的測試框架: 1)Java:JUnit、TestNG2)Python:unittest、pytest3)JavaScript:Jest、Mocha4)C#:NUni…

機器學習——XGBoost

XGBoost(極度梯度提升樹,eXtreme Gradient Boosting)是基于GBDT的優化模型,其最大特性在于對GBDT的損失函數展開到二階導數,使得其梯度提升樹模型更接近其真實損失 其XGBoost分類樹擬合和預測方法的基本思路為: 遍歷所有的樹&…

響應“一機兩用”政策 ,實現政務外網安全

在數字化辦公的浪潮下,企業與政務機構面臨著既要保障數據安全,又要高效訪問互聯網的雙重需求。“一機兩用”成為解決這一難題的關鍵。 政策驅動,需求迫切 隨著《網絡安全法》《數據安全法》等法律法規的相繼出臺,網絡安全防護的要…

【后端】【Django】Django DRF API 單元測試完整方案(基于 `TestCase`)

Django DRF API 單元測試完整方案(基于 TestCase) 一、方案概述 使用 django.test.TestCase 和 rest_framework.test.APIClient 進行 API 單元測試,確保 API 正確性、權限控制、數據返回格式、業務邏輯 等。 二、基本步驟 使用 setUp() 初始…

文生圖語義識別插件使用(controlnet)

1. 插件下載(github) https://github.com/Mikubill/sd-webui-controlnet https://github.com/lllyasviel/ControlNet2. 模型下載(hugging face) https://github.com/Mikubill/sd-webui-controlnet/wiki/Model-download https://huggingface.co/bdsqlsz/qinglong_controlnet-l…

學者觀察 | web3.0產業發展與技術融合——北京大學研究員肖臻

導語 肖臻老師認為在未來很長一段時間內,Web 3.0將和現在的Web 2.0共存。Web 3.0和人工智能(AI)的融合發展前景非常廣闊,Web 3.0致力于打造去中心化的互聯網生態系統,賦予用戶更大的數據所有權和控制權,而…

【模型壓縮+推理加速】知識蒸餾綜述解讀

知識蒸餾綜述解讀 論文: https://arxiv.org/abs/2006.05525 最近Deepseek R1的技術報告中,訓練部分提到使用了知識蒸餾,就像系統性的看看蒸餾算法的原理。看了很多的博客,很多都沒有詳細把知識蒸餾系統的講清楚。我們還是讀一下…

vivo 湖倉架構的性能提升之旅

作者:郭小龍 vivo互聯網 大數據高級研發工程師 導讀:本文整理自 vivo互聯網 大數據高級研發工程師 郭小龍 在 StarRocks 年度峰會上的分享,聚焦 vivo 大數據多維分析面臨的挑戰、StarRocks 落地方案及應用收益。 在 即席分析 場景&#xff0c…

代碼隨想錄算法訓練營第十四天| 226.翻轉二叉樹、101. 對稱二叉樹、104.二叉樹的最大深度、111.二叉樹的最小深度

今日題目 226.翻轉二叉樹 題目鏈接:226. 翻轉二叉樹 - 力扣(LeetCode) 思考:翻轉二叉樹,就是對每一個根節點,都交換左右節點,左右節點進入遞歸繼續交換它們的左右節點。 代碼: # De…

Java設計模式--單例模式

單例模式(構造器私有) 單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一,有以下特點: 單例類只能有一個實例。 單例類必須自己創建自己的唯一實例。 單例類必須給所有其他對象提供這一實例。 反射可以破壞單例模式…

2025年如何避免使用驗證碼求解器時被IP封禁

引言 2025年,驗證碼求解器已成為自動化網絡抓取和其他在線流程的關鍵工具。然而,自動化用戶面臨的一個常見挑戰是IP封禁。當網站檢測到自動化活動時,通常會阻止發出請求的IP地址,導致驗證碼挑戰無法解決。本文將探討使用驗證碼求…

JVM詳解(包括JVM內存模型與GC垃圾回收)

📖前言: 學會使用Java對于一個程序員是遠遠不夠的。Java語法的掌握只是一部分,另一部分就是需要掌握Java內部的工作原理,從編譯到運行,到底是誰在幫我們完成工作的? 接下來著重對Java虛擬機,也就…

【無標題】大亞灣文化體育場多美啊。

請推薦一些常用并且免費的,可直接在線運行【Python】代碼的平臺并列出對應網址 好的,用戶想讓我推薦一些常用且免費的、可以直接在線運行Python代碼的平臺,并且需要列出對應的網址。我需要先回想一下自己知道的在線Python運行環境&#xff0…

權限提升—Windows權限提升土豆家族溢出漏洞通殺全系

前言 OK,Java安全更新不下去了,實在是太難啦啊,想起來提權這一塊沒怎么更新過,接下來都主要是更新提權這一塊的文章了,Java安全的話以后有耐心再搞了。 手動提權 今天主要是講這個手動的提權,手動提權相…

Vue3 知識點總結

Vue3 知識點總結 1. 核心概念 1.1 Composition API 1.1.1 setup 函數 setup是Vue3中的新的配置項,是組件內使用Composition API的入口在setup中定義的變量和方法需要return才能在模板中使用setup執行時機在beforeCreate之前,this不可用 export defa…

python --face_recognition(人臉識別,檢測,特征提取,繪制鼻子,眼睛,嘴巴,眉毛)/活體檢測

dlib 安裝方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 環境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人臉檢測 import cv2 import face_recognition# 讀取人臉圖片 img cv2.imread(r"C:\Users\123\…