1、圖的簡單實現方法——鄰接矩陣
表示圖的一種簡單的方法是使用一個一維數組和一個二維數組,稱為領接矩陣(adjacent matrix)表示法。
對於每條邊(u,v),置A[u,v]等於true;否則,數組的元素就是false。如果邊有一個權,那么可以置A[u][v]等於該權,而使用一個很大或者很小的權來標記不存在的邊。雖然這樣表示非常簡單,但是,它的空間需求則為θ(|V|2),如果圖的邊不是很多,那么這種表示的代價就太大了。若圖是稠密(dense)的:|E|=θ(|V|2),則領接矩陣是合適的表示方法。但大多數情況下並非如此。無向圖用鄰接矩陣表示會浪費一半的空間,稀疏的有向圖用鄰接矩陣表示會浪費大部分空間,稠密的有向圖適合用鄰接矩陣表示。
2、圖的優化實現方法——鄰接表
如果圖是稀疏的(sparse),那么更好的解決方法是使用鄰接表(adjacency list)表示。鄰接表是一個二維容器,第一維是一個數組,存儲所有頂點,第二維是鏈表,存儲所有與這個點領接的點集。此時的空間需求為O(|E|+|V|),它相對於圖的大小而言是線性的。
鄰接表是表示圖的標准方法。無向圖可以以類似的方法表示,但每條邊將會出現在兩個表中,造成空間的雙倍冗余。
實現鄰接表的方法有很多,基本的選擇有兩個:一、使用一個映射,在這個映射下,武漢英語學校關鍵字是頂點,值是那些鄰接表。二、關鍵字是頂點,值是一個包含鏈的類Vertex。
圖的鄰接矩陣實現比較簡單,這里我們只展示圖的鄰接表實現方式。
圖的鄰接表實現總共有3個類,它們分別是:
- 圖的頂點的類:Vertex.java
- 圖的邊類:Edge.java
- 圖類:Graph.java
此外,還有一個測試類Test,以方便驗證圖的構建是否成功,下面是完整的實現代碼。
頂點類Vertex:
邊類Edge
圖類Graph:
測試類Test:
測試結果:
上述實例已經同步到Github,遇到問題的同學可以克隆下來直接運行,鏈接是:https://github.com/Dodozhou/Algorithm/tree/master/src/main/java/dataStructure/graph/graph_ve