1. 程式人生 > >資料結構 筆記:圖的儲存結構

資料結構 筆記:圖的儲存結構

基本思想

-用一維陣列儲存頂點:描述頂點相關的資料

-用二維陣列儲存邊:描述頂點間的關係和權

鄰接矩陣法

-設圖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();

·刪除最近增加的頂點

總結:

-鄰接連結串列法使用連結串列對圖相關的資料進行儲存

-每一個頂點關聯一個連結串列,用於儲存邊相關的資料

-所有頂點按照編號被組織咋同一個連結串列中

-鄰接連結串列法實現的圖能夠支援動態新增刪除/頂點

圖結構例項