【學習總結】《大話數據結構》- 第7章-圖

【學習總結】《大話數據結構》- 總

第7章圖-代碼連接

啓示:

目錄

<!-- GFM-TOC -->html

<!-- GFM-TOC -->git

========================================github

注:

  • 對最小生成樹部分的兩個算法雲裏霧裏的,暫留。

========================================算法

7.1 開場白

  • 一些能夠略過的場面話...

========================================數組

7.2 圖的定義

  • 圖的定義

  • 一、頂點(Vertex):圖中的數據元素稱爲頂點。

(注:線性表中的數據元素叫元素,樹中的數據元素叫結點)數據結構

  • 二、頂點有窮非空:有空表,空樹,但圖結構中,不容許沒有頂點。

  • 三、邊:頂點之間的邏輯關係用邊表示,任意兩個頂點之間均可能有關係

    • 注:邊集能夠爲空

  • 圖的其餘相關定義

    • 無向邊、無向圖、有向邊、有向圖:

  • 簡單圖:

  • 無向徹底圖、有向徹底圖

  • 稀疏圖和稠密圖

  • 權、網

  • 子圖

  • 圖的頂點與邊間的關係

    • 相鄰接、相關聯、頂點的度

  • 鄰接到鄰接自、相關聯、頂點的入度出度

  • 頂點到頂點的路徑

  • 路徑的長度

  • 迴路或環、簡單路徑、簡單迴路或簡單環

  • 連通圖相關術語

    • 連通圖

(注意:連通指的是有路徑便可,不必定要直接存在邊)學習

  • 連通份量

  • 強連通圖、強連通份量

  • 連通圖的生成樹

  • 有向樹、有向圖的生成森林

  • 圖的定義與術語總結

========================================spa

7.3 圖的抽象數據類型

========================================.net

7.4 圖的存儲結構

  • 引入:

  • 爲此,前輩們提供了五種不一樣的存儲結構

  • 鄰接矩陣

    • 定義:

  • 圖示:無向圖、有向圖、網

  • 代碼實現

    圖的鄰接矩陣存儲的結構:

### 無向圖代碼實現:給頂點表和邊表輸入數據的過程 3d

  • 鄰接表

    • 同順序存儲結構預先分配內存所形成的空間浪費而引入鏈式存儲,也可考慮鏈式

  • 定義:數組與鏈表相結合的存儲方法稱爲鄰接表(Adjacency List)

  • 圖示:

    無向圖:

### 有向圖: ### 網:

  • 代碼實現:

    結構定義:

### 代碼實現:

  • 十字鏈表(針對有向圖中鄰接表的缺陷:入度需遍歷問題)

    • 定義:把鄰接表與逆鄰接表結合起來的有向圖的一種存儲方式,Orhtogonal List

      • 從新定義頂點表的結點結構:

- ### 從新定義邊表的結點結構

  • 圖示:(注:能夠理解爲左側頂點表和右側邊表沒啥必然關係,只是那樣擺放了)

  • 複雜度分析:

  • 鄰接多重表(針對無向圖中鄰接表的缺陷:刪除邊需遍歷問題)

    • 定義:(本身編的.....)針對鄰接表在無向圖中的缺陷,仿照十字鏈表進行改進

  • 從新定義邊表結構:

  • 圖示:

  • 優點:

  • 邊集數組

    • 定義:

  • 定義邊數組結構:

  • 圖示:

========================================

7.5 圖的遍歷

  • 圖的遍歷的定義

    • 圖的遍歷(Traversing Graph):

      從圖中某一頂點出發訪遍其他頂點,且使每個頂點僅被訪問一次,這一過程就叫作圖的遍歷。

    • 避免重複訪問屢次的思路:

      設置一個訪問數組visited[n],n是圖中頂點的個數,初值0,訪問後設爲1。

  • 深度優先遍歷

    • 定義:

      深度優先遍歷(Depth_First_Search),也稱深度優先搜索,簡稱DFS

      對於連通圖:從圖中某個頂點v出發,訪問此頂點,而後從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中全部和v有路徑相通的頂點都被訪問到。

      對於非連通圖:對它的連通份量分別進行深度優先遍歷,即在先前一個頂點進行一次深度優先遍歷後,如有還沒有訪問到的頂點,則另選圖中一個不曾被訪問的頂點做爲起始點,重複,直至全部頂點被訪問。

    • 圖示:相似一棵樹的前序遍歷

  • 代碼實現:鄰接矩陣和鄰接表

(鄰接表與鄰接矩陣代碼幾乎相同,只是將數組換成了鏈表)

  • 複雜度分析:

  • 廣度優先遍歷

    • 定義:

      廣度優先遍歷(Breadth_First_Search),又稱廣度優先搜索,簡稱BFS

    • 圖示:相似樹的層序遍歷

  • 代碼實現:鄰接矩陣和鄰接表(數組和指針)

  • 深度和廣度的複雜度分析:

    • 深度優先和廣度優先在時間複雜度上是同樣的,不一樣在於對頂點訪問的順序不一樣

    • 二者在全圖遍歷上沒有優劣之分,視不一樣狀況進行選擇

    • 深度:適合目標明確,以找到目標爲主要目的的狀況

    • 廣度:更適合在不斷擴大遍歷範圍時找到相對最優解的狀況

========================================

7.6 最小生成樹

  • 定義和分類

    • 最小生成樹(Mimimum Cost Spanning Tree):構造連通網的最小代價生成樹稱爲最小生成樹

  • 找連通網的最小生成樹,經典的有兩種算法:

    • 普里姆算法(Prim)

    • 克魯斯卡爾算法(Kruskal)

  • 注意:是「樹」!!!!!

  • 普里姆算法

    • 方法:

  • 理解:

    其實就是從任一頂點開始,不斷遍歷剩餘每一個頂點與已掃描頂點構成的邊並從中取最小權值邊保存,而後將最小邊對應的新頂點加入已掃描頂點。不斷重複以上過程,直到掃描全部頂點爲止。這樣作,能夠找到鏈接全部頂點的最小權值邊。

  • 圖示:先構造鄰接矩陣,後進行遍歷等操做

  • 代碼:(原理懂了,代碼沒太懂...)

  • 代碼分析:

  • 複雜度分析:

  • 克魯斯卡爾算法與邊集數組

    • 邊集數組的結構定義:

  • 邊集數組圖示:

  • 方法:(構建時要考慮是否會造成環路)

  • 理解:

    沒仔細理解,腦袋疼,先直接貼圖往下走了。

    大概就是從邊出發,按權值從小到大進行遍歷,在不構成環的狀況下取最小(由於是樹),仔細實在看不進去,進度已經停滯很久,果斷跳過。

  • 代碼:

  • 代碼分析:

  • 複雜度分析:

  • 兩種算法對比

========================================

7.7 最短路徑

  • 定義:

    對於網圖來講,最短路徑是指兩頂點之間通過的邊上權值之和最少的路徑

    而且稱路徑上的第一個頂點是源點,最後一個頂點是終點。

    非網圖能夠理解爲全部邊的權值都爲1的網。

  • 此處介紹兩種求最短路徑的算法

    迪傑斯特拉(Dijkstra)算法 和 弗洛伊德(Floyd)算法

  • 迪傑斯特拉(Dijkstra)算法

    • 理解:

      • 一個按路徑長度遞增的次序產生最短路徑的算法。

      • 基於已經求出的最短路徑,求得更遠頂點的最短路徑,一步一步求出源點到終點的最短路徑

    • 圖示:

  • 代碼:

  • 代碼分析:

  • 複雜度分析:

    v0頂點到其餘:O(N^2)

    其餘頂點到別的頂點:再循環一次,變爲O(N^3)

  • 弗洛伊德(Floyd)算法

    • 算法:求全部頂點到全部頂點的最短路徑-小例子:

  • 理解:

    求全部頂點到全部頂點的最短,因此用到兩個二維數組。思路是遍歷中轉結點,即某結點從vi中轉到另外一結點的路徑長度並與不中轉時的路徑長度比較,若是中轉更小就更新數組爲中轉方式。

  • 代碼圖示:

  • 代碼:二重循環初始化+三重循環權值修正

  • 代碼分析:

  • 複雜度分析:O(N^3)-三重循環

  • 適用:求全部頂點到全部頂點的最短路徑問題

========================================

7.8 拓撲排序

  • AOV網-有向圖的頂點表示活動的網

  • 拓撲序列

  • 拓撲排序:解決一個工程可否順利進行的問題

  • 拓撲排序算法

    • 基本思路:

  • 數據結構選取:須要刪除結點,用鄰接表

    注:求最小生成樹和最短路徑用了鄰接矩陣。

  • 頂點表的結點結構定義:

  • 圖示:

  • 拓撲排序的結構代碼

  • 輔助數據結構:棧

    • 用來存儲處理過程當中入度爲0的頂點

    • 目的是避免每一個查找時都要去遍歷頂點表找有沒有入度爲0的頂點

  • 代碼

  • 代碼分析

  • 複雜度分析

========================================

7.9 關鍵路徑

  • 關鍵路徑:解決工程完成須要的最短期問題。

  • AOE網-有向圖的邊表示活動的網

  • AOE網和AOV網的對比

    • AOV網:頂點表示活動的網,只描述活動之間的制約關係

    • AOE網:用邊表示活動的網,邊上的權值表示活動持續的時間

  • 路徑長度,關鍵路徑,關鍵活動

  • 定義幾個參數

  • 圖示

  • 準備

    • 求最先發生時間etv的過程,就是從頭到尾找拓撲序列的過程

    • 所以在求關鍵路徑前,須要先調用一次拓撲序列算法來計算etv和拓撲序列列表

  • 改進的求拓撲序列算法

    • 代碼

  • 代碼分析

  • 關鍵路徑算法代碼

  • 關鍵路徑算法代碼分析

  • 關鍵路徑算法的複雜度分析

  • 多條關鍵路徑時縮短工期

========================================

7.10 總結回顧

  • 圖的存儲結構:

  • 圖的遍歷:深度、廣度

  • 圖的應用:

    • 最小生成樹:普里姆、克魯斯卡爾

    • 最短路徑:迪傑斯特拉、弗洛伊德

    • 有向無環圖的應用:拓撲排序、關鍵路徑算法

========================================

7.11 結尾語

END

相關文章
相關標籤/搜索