數據之間的關係有 3 種,分別是 “一對一”、“一對多” 和 “多對多”,前兩種關係的數據可分別用線性表和樹結構存儲,具有"多對多"邏輯關係數據的結構——圖。
1. 圖的定義
定義:圖(graph)是由一些點(vertex)和這些點之間的連線(edge)所組成的;其中,點通常被成爲"頂點(vertex)",而點與點之間的連線則被成爲"邊或弧"(edege)。通常記爲,G=(V,E)。
2 圖的分類
分類依據:是否有方向
兩大類:無向圖、有向圖。
-
無向圖
圖一 -
有向圖
圖二
簡單的來說,有向圖和無向圖的區別就是從頂點到另一個頂點是否只存方向性。比如說,上圖有向圖是航班圖,也就是說,從V3到V4有航班,但是要從V4到V3只能是V4->V1->V3.
與鏈表不同,圖中存儲的各個數據元素被稱爲頂點(而不是節點)
圖存儲結構中,習慣上用 Vi 表示圖中的頂點,且所有頂點構成的集合通常用 V 表示,如圖 一 中頂點的集合爲 V={V1,V2,V3,V4}。
3 圖的基本屬性
- 弧頭和弧尾
有向圖中,無箭頭一端的頂點通常被稱爲"初始點"或"弧尾",箭頭直線的頂點被稱爲"終端點"或"弧頭"。
- 入度和出度
對於有向圖中的一個頂點 V 來說,箭頭指向 V 的弧的數量爲 V 的入度(InDegree,記爲 ID(V));箭頭遠離 V 的弧的數量爲 V 的出度(OutDegree,記爲OD(V))。拿圖 2 中的頂點 V1來說,該頂點的入度爲 1,出度爲 2(該頂點的度爲 3)。
- (V1,V2) 和 <V1,V2> 的區別
無向圖中描述兩頂點(V1 和 V2)之間的關係可以用 (V1,V2) 來表示,而有向圖中描述從 V1 到 V2 的"單向"關係用 <V1,V2> 來表示。
由於圖存儲結構中頂點之間的關係是用線來表示的,因此 (V1,V2) 還可以用來表示無向圖中連接 V1 和 V2 的線,又稱爲邊;同樣,<V1,V2> 也可用來表示有向圖中從 V1 到 V2 帶方向的線,又稱爲弧。
- 集合 VR 的含義
並且,圖中習慣用 VR 表示圖中所有頂點之間關係的集合。例如,圖 1 中無向圖的集合 VR={(v1,v2),(v1,v4),(v1,v3),(v3,v4)},圖 2 中有向圖的集合 VR={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>}。
- 路徑和迴路
無論是無向圖還是有向圖,從一個頂點到另一頂點途徑的所有頂點組成的序列(包含這兩個頂點),稱爲一條路徑。如果路徑中第一個頂點和最後一個頂點相同,則此路徑稱爲"迴路"(或"環")。
並且,若路徑中各頂點都不重複,此路徑又被稱爲"簡單路徑";同樣,若迴路中的頂點互不重複,此迴路被稱爲"簡單迴路"(或簡單環)。
拿圖 1 來說,從 V1 存在一條路徑還可以回到 V1,此路徑爲 {V1,V3,V4,V1},這是一個迴路(環),而且還是一個簡單迴路(簡單環)。
在有向圖中,每條路徑或迴路都是有方向的。
- 權和網的含義
在某些實際場景中,圖中的每條邊(或弧)會賦予一個實數來表示一定的含義,這種與邊(或弧)相匹配的實數被稱爲"權",而帶權的圖通常稱爲網。如圖 3 所示,就是一個網結構:
圖 三 帶權的圖存儲結構
在學習“哈弗曼樹”的文章中,已經瞭解了“權”的概念。這裏圖的權與之類似。
子圖:指的是由圖中一部分頂點和邊構成的圖,稱爲原圖的子圖。
4. 圖的結構
根據不同的特徵,我們將圖劃分爲完全圖,連通圖、稀疏圖和稠密圖。
- 完全圖
也就是說,每一個節點都和除了自身之外的所有節點相連。
完全圖分兩種,無向和有向。
具有 n 個頂點的完全圖,圖中邊的數量爲 n(n-1)/2;而對於具有 n 個頂點的有向完全圖,圖中弧的數量爲 n(n-1)。 - 連通圖
簡單來說,就是圖中任意連個頂點,都可以通過某條路徑找到對方。
連通圖:
非連通圖:
- 稀疏圖和稠密圖
稀疏和稠密的判斷條件是:
e<nlogn,其中 e 表示圖中邊(或弧)的數量,n 表示圖中頂點的數量。如果式子成立,則爲稀疏圖;反之爲稠密圖。
5 圖的存儲類型
5.1 順序存儲結構
簡單的來說,就是使用數組來存儲圖。使用一維數組存儲節點,在使用另一個二維數組存儲出頂點之間的關係。
5.2 鄰接矩陣存儲結構
說的是,使用矩陣來表示圖的邏輯關係。如下圖所示
- 無向圖G1
- G1的臨接矩陣
映射關係:頂點和另一個頂點之間沒有弧或者邊的存在,則記爲0,否則記爲1.
說明: - 如果是有向圖,那麼如果是A–>B,則AB標識爲1, BA標識爲0。
- 上邊提到,一個一維數組用來保存頂點信息,一個二維數組來用保存邊的信息,從圖中我們可以看到,存在大量的 0 元素,這就引出了鄰接矩陣的缺點耗費空間。
5.3 鄰接表存儲結構
爲了解決鄰接矩陣耗費空間的缺點。我們引入了鄰接表。所謂鄰接表,簡單來說,就是將與當前節點有連接的節點的下標記錄下來。詳細如下圖:
以5.2節,無向圖G1爲例。其鄰接表是:
5.4 十字鏈表存儲結構
待續……
聲明:本文內容系整理自網絡內容,以及增加了個人一點理解。
參考內容: