【DSA】圖-理論基礎(1)

數據之間的關係有 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 十字鏈表存儲結構

待續……


聲明:本文內容系整理自網絡內容,以及增加了個人一點理解。
參考內容:

  1. http://c.biancheng.net/view/3404.html
  2. https://www.cnblogs.com/skywang12345/p/3691463.html
  3. https://www.oschina.net/translate/data-structures-for-beginners-graphs-time-complexity-tutorial
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章