數據結構與算法之圖的概念、存儲結構及遍歷方式

1、圖的概念
一、圖:圖(graph)由邊(edge)的集合及頂點(vertex)的集合組成。一般記爲:G=(V,E)。
二、有向圖、無向圖
圖根據邊有無方向分爲有向圖和無向圖。
 
有向圖
無向圖
定義
圖中的每條邊都是有方向的。
圖中的每條邊都是無方向的。
示例圖
說明
G=(V1,{E1}),其中:
V1={A, B, C, D, E, F},V1表示由"A,B,C,D,E,F"幾個頂點組成的集合。
E1={<A, B>, <A, C>, <B, C>, <B, E>, <C, D>, <C, F>, <E, F>}。E1是由矢量<A,B>,矢量<A,C>...等組成的集合。其中,<A,C>表示由頂點A指向頂點C的有向邊。
G=(V2,{E2}),其中:
V2={A, B, C, D, E, F},V2表示由"A,B,C,D,E,F"幾個頂點組成的集合。
E2={(A, B), (A, C), (B, C), (B, E), (C, D), (C, F), (E, F)}。E2是由邊(A,B),邊(A,C)...等組成的集合。其中,(A,C)表示由頂點A和頂點C鏈接成的邊。
三、鄰接點、入邊、出邊
鄰接點:一條邊上的兩個頂點叫作鄰接點。
在有向圖中,除了鄰接點以外,還有「入邊」和「出邊」的概念。
入邊:是指以該頂點爲終點的邊;
出邊:指以該頂點爲起點的邊。
例如:
    在上面的無向圖中,頂點A和頂點B就是鄰接點;
    在上面的有向圖中,<A, B>是A的出邊、B的入邊。
四、度:一個頂點的度是指與該頂點相關聯的邊的條數,頂點v的度記做d(v)。
對於有向圖來講,一個頂點的度可細分爲入度和出度。
入度:一個頂點的入度是指與其關聯的各邊之中,以其爲終點的邊數;
出度:出度則是相對的概念,指以該頂點爲起點的邊數。
例如:
    在上面的無向圖中,頂點A的度爲2,頂點C的度爲3,頂點D的度爲1;
    在上面的有向圖中,頂點A的入度是0,出度是2;頂點B的入度是1,出度是2;頂點C的入度是2,出度是2。
 
2、圖的存儲結構
圖的存儲結構主要有鄰接矩陣、鄰接表、十字鏈表、多重鏈表,最經常使用的是鄰接矩陣和鄰接表。
 
鄰接矩陣
鄰接表
定義
鄰接矩陣是表示頂點之間相鄰關係的矩陣。設圖G有n個頂點,則鄰接矩陣是一個n*n的方陣,定義爲:
當圖中的邊數較少時,用鄰接矩陣來實現圖結構會浪費不少內存空間,使用鄰接表更省空間。
示例圖(無向圖)
示例圖(有向圖)
優勢
能夠直接判斷兩頂點之間是否有邊或弧,速度很快。
通常用於存儲稠密圖。
空間效率高;容易尋找頂點的鄰接點。
通常用於存儲稀疏圖。
缺點
存儲空間大,會影響算法的空間效率,甚至時間效率。
判斷兩頂點之間是否有邊或弧需搜索兩節點對應的單鏈表,沒有鄰接矩陣方便。
 
3、圖的遍歷
圖的遍歷是指從圖中的任一頂點出發, 對圖中的全部頂點訪問一次且只訪問一次。圖的遍歷分爲深度優先遍歷和廣度優先遍歷。
 
深度優先遍歷(Depth-First-Search, DFS)
廣度優先遍歷(Breadth-First-Search, BFS)
方法
①訪問頂點v;
②依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;
③若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,從新進行深度優先遍歷,直到圖中全部頂點均被訪問過爲止。
① 訪問頂點vi; 
② 訪問vi的全部未被訪問的鄰接點w1 ,w2 , …wk;
③ 依次從這些鄰接點(在步驟②中訪問的頂點)出發,訪問它們的全部未被訪問的鄰接點; 依此類推,直到圖中全部訪問過的頂點的鄰接點都被訪問。
示例圖
步驟
DFS在訪問圖中某一塊兒始頂點A後,由A出發,訪問它的任一鄰接頂點B;
從B出發,訪問與B鄰接但尚未訪問過的頂點E;
從E出發,訪問與E鄰接但尚未訪問過的頂點G;
由於G的鄰接頂點都已被訪問,因此退回到頂點E;
由於E的鄰接頂點都已被訪問,因此退回到頂點B;
由於B有未訪問的鄰接頂點C,則從B出發,訪問C;
從C出發,訪問與C鄰接但尚未訪問過的頂點F;
從F出發,訪問與F鄰接但尚未訪問過的頂點D(也能夠先訪問H);
由於D的鄰接頂點都已被訪問,因此退回到頂點F;
由於F有未訪問的鄰接頂點H,則從F出發,訪問H;
從H出發,訪問與H鄰接但尚未訪問過的頂點I;
由於I的鄰接頂點都已被訪問,因此退回到頂點H;
由於H的鄰接頂點都已被訪問,因此退回到頂點F;
由於F的鄰接頂點都已被訪問,因此退回到頂點C;
由於C的鄰接頂點都已被訪問,因此退回到頂點B;
由於B的鄰接頂點都已被訪問,因此退回到頂點A;
全部頂點都被訪問過,遍歷結束。
BFS在訪問圖中某一塊兒始頂點A後,由A出發,依次訪問它的鄰接頂點B、C、D;
由於先訪問的B,因此從B出發,訪問與B鄰接但尚未訪問過的頂點E;
從C出發,訪問與C鄰接但尚未訪問過的頂點F;
由於D的鄰接頂點均被訪問,因此從E出發,訪問與E鄰接但尚未訪問過的頂點G;
從E出發,訪問與F鄰接但尚未訪問過的頂點H;
從H出發,訪問與H鄰接但尚未訪問過的頂點I;
全部頂點都被訪問過,遍歷結束。
結果
A→B→E→G→C→F→D→H→I
A→B→C→D→E→F→G→H→I

 

原文:https://www.cnblogs.com/sunshineliulu/p/7833793.htmlhtml

相關文章
相關標籤/搜索