【數據結構】圖

圖結構可以分爲有向圖和無向圖,常見地表示方法有數組表示法、鄰接表、十字鏈表和鄰接多重表,遍歷地方式有兩種,一種是深度優先遍歷,另一種是廣度優先比遍歷。

1.1 什麼是圖
  • 每個數據元素稱爲頂點,在有向圖中,從V1到V3稱爲一條,V3到V1是另一條弧,V1稱爲弧尾,V3稱爲弧頭。在無向圖中,從V 1到V3稱爲一條
  • 有n個頂點,1/2n(n-1)條邊地無向圖稱爲完全圖,有n(n-1)條弧地有向圖稱爲有向完全圖,有很少條邊或圖稱爲稀疏圖,反之稱爲稠密圖
  • 在G2無向圖中,類似V3與V1、V2和V4之間有邊的互稱爲鄰接點與頂點相關聯的邊數稱爲頂點的
  • 在G1有向圖中,頂點的度是頂點的出度和入度之和,以頂點爲頭的弧的數目稱爲入度,爲尾的弧的數目稱爲出度
  • 從一個頂點到另一個頂點的頂點序列稱爲路徑,在有向圖中,路徑是有方向的,路徑上邊或弧的數目稱爲路徑的長度,如果一條路徑中的起始頂點和結束頂點相同,那麼稱這個路徑爲或者迴路,不出現重複頂點的路徑稱爲簡單路徑
  • 無向圖中,如果一個頂點到另一個頂點有路徑,那麼它們就是連通的,如果圖中的任意兩個頂點都是連通的,那麼這個圖就是連通圖。無向圖中的極大連通子圖稱爲連通分量
  • 如果是有向圖中的任意一對頂點都有路徑,那麼這個就是強連通圖,相應的它的極大連通子圖就稱爲強連通圖分量
  • 一個連通圖的一個極小連通子圖,它包含所有頂點,但足以構成一棵樹的n-1條邊,加一條邊必定會形成,這個就稱爲生成樹
1.2 圖的表示

表示圖的方法通常有四種:
1、數組表示法;
2、鄰接表;
3、十字鏈表;
4、鄰接多重表。
鄰接表是圖的一種鏈式存儲結構,十字鏈表是有向圖的另一種鏈式存儲結構,鄰接多重表是無向圖的另一種鏈式存儲結構。

1.3 鄰接表的表示與實現

鄰接表有兩種節點,一種是頭節點,另一種是表節點。頭結點中存儲一個頂點的數據和指向鏈表中第一個結點,表結點中存儲當前頂點在圖中的位置和指向下一條邊或弧的結點,表頭結點用鏈式或順序結構方法存儲。
在這裏插入圖片描述
如下所示就是對上圖G2無向圖的鄰接表表示:
在這裏插入圖片描述

1.4 圖的遍歷

通常圖的遍歷有兩種:神難度優先搜索和廣度優先搜索。

  • 深度優先搜索
    即樹的先根遍歷的推廣。基本思想是

從圖G的某個頂點v0出發,然後選擇一個與v0相鄰且沒有被訪問過的頂點vi訪問,再從vi出發選擇一個與vi相鄰且沒有被訪問的頂點vj進行訪問,依次繼續。如果當前被訪問的頂點的所有鄰接頂點都已經被訪問,則退回到已被訪問的頂點序列中最後一個擁有未被訪問的相鄰頂點的頂點w,從w出發按同樣的方法向前遍歷,直到圖中所有頂點都被訪問。

  • 廣度優先搜索
    即樹的按層次遍歷的推廣,其基本思想是:

首先訪問初始點vi,並將其標記爲已被訪問過,接着訪問vi的所有未被訪問過的臨界點vi1,vi2,……,vin的次序,訪問每一個頂點的所有未被訪問過的鄰接點,並均標記爲已訪問過,以此類推,直到圖中所有和初始點vi有路徑相通的頂點都被訪問過爲止。

若一個拓撲結構如下:
在這裏插入圖片描述
深度優先搜索遍歷順序爲
0 > 1 > 3 > 7 > 4 > 2 > 5 > 6
廣度優先搜索遍歷順序爲
0 > 1 > 2 > 3 > 4 > 5 > 6 > 7

1.5 最小生成樹

一個有n個節點的連通圖的生成樹是原圖的極小連通圖,且包含原圖中的所有n個節點,並且有保持圖連通的最少的邊。最小生成樹可以用kruskal算法或prim算法求出。最小生成樹其實是最小權重生成樹的簡稱。

  • 最小生成樹性質:設G=(V,E)是一個連通網絡,U是頂點集V的一個非空真子集。若(u,v)是G中一條“一個端點在U中(例如:u∈U),另一個端點不在U中的邊(例如:v∈V-U),且(u,v)具有最小權值,則一定存在G的一棵最小生成樹包括此邊(u,v)。
  • 求MST的一般算法可描述爲:針對圖G,從空樹T開始,往集合T中逐條選擇並加入n-1條安全邊(u,v),最終生成一棵含n-1條邊的MST。
    當一條邊(u,v)加入T時,必須保證T∪{(u,v)}仍是MST的子集,我們將這樣的邊稱爲T的安全邊。
1.6 拓撲排序

簡單地說,拓撲排序就是在有向圖中,想訪問一個頂點需要先訪問它的所有前驅頂點,執行步驟爲:
1、在有向圖中選一個沒有前驅的頂點輸出;
2、從圖中刪除該頂點和所有以它爲尾的弧;
3、重複上述步驟直到所有頂點都輸出或者圖中不存在無前驅的頂點爲止,後者則說明圖中有環。

1.7 最短路徑問題

最短路徑問題是圖論研究中的一個經典算法,旨在尋找圖(由節點和路徑組成的)中兩節點之間的最短路徑。
Dijkstra算法就是典型的最短路徑由算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點爲中心向外層層擴展,知道擴展到終點爲止。Dijkstra算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。
其採用的是貪心法的算法策略,大概過程是先創建兩個表,OPEN和CLOSE表。OPEN表保存所有已生成而未考察的節點,CLOSE表記錄已訪問過的節點,然後

1、訪問路網中距離起始點最近且沒有被檢查過的點,把這個點放入OPEN組中等待檢查;
2、從OPEN表中找出距起始點最近的點,找出這個點的所有子節點,把這個點放到CLOSE表中;
3、遍歷考察這個點的子節點,求出這些子節點距起始點的距離值,放子節點到OPEN表中;
4、重複第2、3步,知道OPEN表爲空或找到目標點。

發佈了89 篇原創文章 · 獲贊 15 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章