圖的基本介紹
線性表侷限於一個直接前驅和一個直接後繼的關係,樹也只能有一個直接前驅也就是父節點。當我們需要表示多對多的關係時,就需要用到圖。
圖的基本概念
圖(Graph)是一種數據結構,由頂點(vertex)和邊(edge)組成,通常表示爲G=(V,E):
- G:表示一個圖
- V:表示圖中頂點的集合,頂點集V有窮且非空
- E: 表示圖中邊的集合,邊集E可以是空的
邊:兩個頂點之間的連接。
路徑:一個頂點到另一個頂點的通路。
比如下面的無向圖中,從頂點D到頂點C的路徑有:
- D->B->C
- D->B->A->C
無向圖(Undirected Graph):頂點之間的路徑沒有方向,比如A-B,即可以是A->B也可以B->A,上面的圖就是一個無向圖。
有向圖(Directed Graph):頂點之間的路徑有方向,比如A-B,只能是A->B,不能是B->A,下面的圖就是一個有向圖。
出度(Out-degree):一個頂點的出度爲x,是指有x條邊以該頂點爲起點,例如上面的有向圖中,頂點A的出度是2。
入度(In-degree):一個頂點的入度爲x,是指有x條邊以該頂點爲終點,例如上面的有向圖中,頂點C的入度是2。
出度、入度適用於有向圖。
帶權圖(Weighted Graph):邊帶權值的圖也叫網。
圖的表示方式
圖的表示方式有兩種:
- 鄰接矩陣(Adjacency Matrix)
- 鄰接表(Adjacency List)
鄰接矩陣
鄰接矩陣是表示圖形中頂點之間相鄰關係的矩陣,通常採用一個存放頂點信息的一位數組和一個存放邊信息的二維數組實現。
使用鄰接矩陣實現的無向圖如下:
說明:
- 鄰接矩陣中的1代表兩個頂點之間直連,0代表兩個頂點之間不直連。
- 頂點V1與頂點V0和頂點V2直連,所以鄰接矩陣的第二行第一列和第三列爲1。
使用鄰接矩陣實現的有向圖如下:
鄰接矩陣比較適合稠密圖,不然會比較浪費內存。
鄰接表
鄰接矩陣需要爲每個頂點都分配n個邊的空間,其實有很多邊都是不存在,會造成空間的一定損失。
鄰接表的實現只關心存在的邊,不關心不存在的邊。因此沒有空間浪費,鄰接表由數組+鏈表組成。
使用鄰接表實現的無向圖如下:
說明:
- 頂點V1與頂點V0和頂點V2直連,所以頂點V1對應的鏈表爲V0->V3。
使用鄰接表實現的有向圖如下: