資料結構 筆記:圖的儲存結構
基本思想
-用一維陣列儲存頂點:描述頂點相關的資料
-用二維陣列儲存邊:描述頂點間的關係和權
鄰接矩陣法
-設圖A = (V,E)是一個有n個頂點的圖,圖的鄰接矩陣為Edge[n][n],則:
Edge[i][i] = w,w權值,i和j連線;空,i == j或i 和j不連線
注:解決工程問題時,習慣於對圖中的每個頂點進行編號,當不需要權值時,去w非空表示結點間的有連線
鄰接矩陣法例項一
-無向圖的鄰接矩陣是對稱的
-有向圖的鄰接矩陣可能是不對稱的
設計與實現
實現方式一:直接使用陣列表示頂點集和邊集
template<int N,typename V,typename E> class MatrixGraph : public Graph<V,E> { protected: V m_vertexes[N]; E m_edges[N][N]; int m_eCoount; public: // ... }
問題
-構造效率低下
·圖物件初始化時,頻繁呼叫頂點型別和邊型別的建構函式
-空間使用率低下
·圖物件佔用大量空間,而大多數空間處於閒置狀態
-無法表示空值
·無法用同一的方式表示邊為空的情形
實現方式二:使用指標陣列表示頂點集和邊集
template <int N,typename V,typename E> class MatrixGraph : public Graph<V,E> { protected: V* m_vertexes[N]; E* m_edges[N][N]; int m_eCount; public: // ... }
問題的解決
-構造效率
·初始化影象物件時,只需要將陣列元素賦值為空
-空間使用率
·頂點資料元素和邊資料元素在需要時動態建立
-空值的表示
·任意的頂點型別和邊型別都使用NULL表示空值
儲存結構
-鄰接矩陣法使用陣列對圖相關的資料進行儲存
-一維陣列儲存頂點相關的資料(空表無相關資料)
-二維陣列儲存邊相關的資料(空表頂點間無連線)
-程式碼實現是使用指標陣列進行資料的儲存(提高效率)
鄰接矩陣法中的殘留問題
-無法動態新增/刪除頂點!!!
二、
基本思想
-為了進一步提高空間使用率,可以考慮使用連結串列換陣列,將臨界矩陣變換我鄰接連結串列
鄰接連結串列法
-圖中所有頂點按照編號儲存於同一個連結串列中
-每一個頂點對應一個連結串列,用於儲存始發於改頂點的邊
-每一條邊的訊號包含:起點,終點,權值
鄰接連結串列法示例
邊資料型別的設計
strcut Edge : public Object
{
int b; //起始頂點
int e; //鄰接頂點
E data; //權值
};
頂點資料型別的設計
strcut Vertex : public Object
{
V* data; //頂點資料元素值
LinkList<Edge> edge; //鄰接與該頂點的邊
//...
};
動態增加/刪除頂點
-int addVertex();
·增加新的頂點,返回頂點編號
-int addVertex(const V& value);
·增加新頂點的同事附加資料元素
-void removeVertex();
·刪除最近增加的頂點
總結:
-鄰接連結串列法使用連結串列對圖相關的資料進行儲存
-每一個頂點關聯一個連結串列,用於儲存邊相關的資料
-所有頂點按照編號被組織咋同一個連結串列中
-鄰接連結串列法實現的圖能夠支援動態新增刪除/頂點