首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

資料結構圖論篇:圖的五種儲存結構深度解析

     編輯:關於C語言

為什麼圖需要特殊儲存結構?

圖由頂點與邊/弧組成,元素間關係複雜,無法像線性表或樹那樣用記憶體物理位置表示邏輯關係,因此需要專門的儲存結構。

7.4.1 鄰接矩陣

採用兩個陣列:一維陣列存頂點,二維陣列存邊關係。

定義

設圖 G(V,E) 有 n 個頂點,鄰接矩陣為 n×n 方陣:

  • 無向圖:arc[i][j] = 1 表示有邊,矩陣對稱
  • 有向圖:arc[i][j] = 1 表示弧 <Vi, Vj>,矩陣不對稱
  • 帶權圖:arc[i][j] 存權值,無連線用 ∞ (如 65535)

操作效率

  • 判斷兩頂點是否相連:O(1)
  • 求頂點度:掃描一列/行,O(n)
  • 求所有鄰接點:掃描一列,O(n)
  • 有向圖入度:掃描一行;出度:掃描一列

結構定義

#define MAXVEX 100
#define INFINITY 65535

typedef struct {
    char vexs[MAXVEX];        // 頂點表
    int arc[MAXVEX][MAXVEX];  // 鄰接矩陣
    int numVertexes;          // 頂點數
    int numEdges;             // 邊數
} MGraph;

7.4.2 鄰接表

針對稀疏圖優化空間:頂點用陣列,每個頂點的鄰接點用單向鏈表。

  • 無向圖:邊表
  • 有向圖:出邊表(以頂點為弧尾)
  • 逆鄰接表:以頂點為弧頭,便於求入度
  • 帶權:邊表節點增加 weight 域

操作效率

  • 求度:遍歷邊表計數
  • 判斷相連:遍歷邊表查找
  • 求鄰接點:遍歷邊表

7.4.3 十字鏈表

有向圖專用,結合鄰接表與逆鄰接表,節點同時有「出弧」與「入弧」指標,可同時高效求入度與出度。

7.4.4 鄰接多重表

無向圖專用,邊表節點被兩個頂點共享,避免無向圖鄰接表中邊資料重複儲存。

7.4.5 邊集陣列

兩個結構:頂點表 + 邊集陣列(每個元素存始點、終點、權值)。適合以邊為中心的演算法(如 Kruskal)。

結構選擇指南

結構適用場景空間複雜度查邊求度
鄰接矩陣稠密圖、頻繁查邊O(n²)O(1)O(n)
鄰接表稀疏圖、頻繁遍歷鄰接點O(n+e)O(度)O(度)
十字鏈表有向圖、需同時求入/出度O(n+e)O(度)O(1)
鄰接多重表無向圖、邊操作頻繁O(n+e)O(度)O(度)
邊集陣列Kruskal 等邊中心演算法O(e)O(e)O(e)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved