圖論(1):圖數據結構

目錄

一、圖的定義

1.1 圖的基本概念

1.2 圖的分類

(1)按邊的方向:

(2)按邊的權值:

(3)按邊的數量和類型:

(4)按連通性:

1.3 圖的基本術語

二、圖的表示方法

2.1 鄰接矩陣(Adjacency Matrix)

2.2 鄰接表(Adjacency List)

2.3 邊列表(Edge List)

2.4 關聯矩陣(Incidence Matrix)

三、圖的關系建模

3.1 建模基本思路

3.2 表結構設計

(1)頂點表設計

(2)邊表設計(適用于有向圖)

(3)標簽元數據表設計

(4)無向圖處理方法

1 圖的基本結構相關概念

2圖的類型和性質

3 圖的遍歷與算法相關概念

4 圖的矩陣表示與運算

5 高階圖模型與擴展概念


圖論(Graph Theory)是計算機科學中研究“對象之間關系”的重要分支,它以“圖”作為基本結構來建模現實世界中各種“點”和“連接”。本篇文章將系統介紹圖的基礎概念——圖的定義圖的表示方法,幫助讀者構建圖論學習的核心框架。

一、圖的定義

1.1 圖的基本概念

一個圖(Graph)是由一組頂點(Vertices)和一組邊(Edges)構成的集合結構。用數學符號表示為:

G = (V, E)

其中:

  • V 是圖中頂點的集合,通常記作 V = \{v_1, v_2, \ldots, v_n\};

  • E 是圖中邊的集合,每條邊連接兩個頂點。

邊可以是無向的,也可以是有向的。

1.2 圖的分類

圖根據其結構特性可以細分為多種類型:

(1)按邊的方向:
  • 無向圖(Undirected Graph):邊不具備方向性,(u, v) 與 (v, u) 等價;

  • 有向圖(Directed Graph):邊具有方向性,(u, v) 表示從 u 指向 v。

(2)按邊的權值:
  • 非加權圖(Unweighted Graph):所有邊等價;

  • 加權圖(Weighted Graph):每條邊都有一個權值(如距離、代價等),表示邊的“強度”或“成本”。

(3)按邊的數量和類型:
  • 簡單圖(Simple Graph):不含重邊和自環;

  • 多重圖(Multigraph):允許兩個頂點之間存在多條邊(重邊);

  • 偽圖(Pseudograph):允許自環和重邊。

(4)按連通性:
  • 連通圖(Connected Graph):無向圖中任意兩個頂點之間至少存在一條路徑;

  • 強連通圖(Strongly Connected Graph):有向圖中任意兩點之間都可互達;

  • 弱連通圖(Weakly Connected Graph):有向圖在忽略方向后是連通的。

1.3 圖的基本術語

  • 頂點(Vertex):圖中的基本單位;

  • 邊(Edge):連接兩個頂點的線段,表示關系;

  • 度(Degree)

    • 無向圖中:一個頂點的度是連接該頂點的邊數;

    • 有向圖中:包括入度(In-degree)*和*出度(Out-degree)

  • 路徑(Path):由一系列連續邊組成的頂點序列;

  • 簡單路徑(Simple Path):路徑中頂點不重復;

  • 環(Cycle):起點和終點相同的簡單路徑;

  • 自環(Loop):起點和終點為同一頂點的邊;

  • 重邊(Multiple Edge):連接同一對頂點的多條邊;

  • 稀疏圖與稠密圖

    • 稀疏圖:邊的數量遠小于頂點對的數量;

    • 稠密圖:邊的數量接近最大邊數(例如 n(n-1)/2)。

二、圖的表示方法

在計算機中使用圖時,必須選擇合適的數據結構對其進行編碼。常見的圖表示方式包括:

2.1 鄰接矩陣(Adjacency Matrix)

鄰接矩陣是一種二維數組 A[n][n],用來表示頂點之間是否相連。

  • 若 i 與 j 之間有邊,則 A[i][j] = 1(或等于權重);

  • 否則 A[i][j] = 0;

  • 無向圖的鄰接矩陣是對稱的;

  • 有向圖不一定對稱。

示例:

設圖 G 有 3 個頂點,邊為 (0, 1), (1, 2),鄰接矩陣為:

  0 1 2
0 0 1 0
1 1 0 1
2 0 1 0

優點:

  • 查詢任意兩點是否連接只需 O(1) 時間;

  • 結構簡單,適用于稠密圖。

缺點:

  • 空間復雜度為 O(n^2),不適用于稀疏圖。

2.2 鄰接表(Adjacency List)

鄰接表用一個數組加多個鏈表來表示圖:

  • 每個頂點擁有一個鏈表,鏈表中記錄與該頂點相鄰的頂點;

  • 對于無向圖,每條邊需在兩個頂點的鏈表中都出現;

  • 對于有向圖,只記錄出邊。

示例:

0: 1 ?
1: 0 → 2 ?
2: 1

優點:

  • 空間復雜度為 O(n + m),適合稀疏圖;

  • 遍歷某一頂點的鄰接點效率高。

缺點:

  • 查詢兩點之間是否有邊需遍歷鏈表,最壞為 O(n)。


2.3 邊列表(Edge List)

邊列表使用一個列表來記錄圖中所有邊:

  • 每條邊表示為一個二元組 (u, v) 或三元組 (u, v, w)(帶權);

  • 通常用于圖算法中。

示例:

[(0, 1), (1, 2)]

優點:

  • 簡單直接,節省空間;

  • 適合用于邊排序、生成樹等算法。

缺點:

  • 查詢效率低,不利于鄰接點快速訪問。


2.4 關聯矩陣(Incidence Matrix)

關聯矩陣是一個 n \times m 的矩陣(n 是頂點數,m 是邊數):

  • 無向圖中,若邊 e_j 與頂點 v_i 相連,則 M[i][j] = 1;

  • 有向圖中,若 v_i 是起點則 M[i][j] = 1,若 v_i 是終點則 M[i][j] = -1。

優點:

  • 可用于代數圖理論分析;

  • 明確表示頂點與邊的連接關系。

缺點:

  • 在實際編程中使用不多,空間浪費較大。

表示方法對比:

表示方法空間復雜度查詢邊是否存在枚舉鄰接點適用場景
鄰接矩陣O(n^2)O(1)O(n)稠密圖
鄰接表O(n + m)最壞 O(n)O(k)稀疏圖
邊列表O(m)O(m)不適用構建/排序
關聯矩陣O(n \times m)O(m)不適用理論研究

三、圖的關系建模

雖然圖結構在本質上是非關系型的,但在沒有圖數據庫(如 Neo4j、JanusGraph)可用的場景下,我們仍可以通過關系型數據庫(RDBMS)來表達圖的數據結構與連接關系。

3.1 建模基本思路

圖在 RDBMS 中建模的核心思想是將頂點和邊分別表示為關系表(Relation)

  • 頂點表(Vertex Table):存儲圖中的所有節點;

  • 邊表(Edge Table):存儲圖中所有的邊(連接關系)。

3.2 表結構設計

(1)頂點表設計
CREATE TABLE vertex (id INT PRIMARY KEY, ? ? ? ? -- 頂點唯一標識label_id INT NOT NULL, ? ? ?-- 頂點類型properties JSON, ? ? ? ? ? ?-- 頂點屬性FOREIGN KEY (label_id) REFERENCES label(id)
);

properties 字段可以靈活地以 JSON 形式存儲各類屬性,適合屬性異構的圖場景。如果屬性固定,也可將其展開為單獨的列。

(2)邊表設計(適用于有向圖)
CREATE TABLE edge (id INT PRIMARY KEY, ? ? ? ? ? ? ?-- 邊的唯一標識from_vertex INT NOT NULL, ? ? ? ?-- 起點to_vertex INT NOT NULL, ? ? ? ? ?-- 終點label_id INT NOT NULL, ? ? ? ? ? -- 邊的類型weight DECIMAL(10,2), ? ? ? ? ? ?-- 權重properties JSON, ? ? ? ? ? ? ? ? -- 邊的屬性FOREIGN KEY (from_vertex) REFERENCES vertex(id),FOREIGN KEY (to_vertex) REFERENCES vertex(id),FOREIGN KEY (label_id) REFERENCES label(id)
);
  • 該結構適用于有向圖(Directed Graph)

  • 支持為每條邊添加類型、權重或其他靈活的屬性;

  • 使用外鍵約束維護邊和頂點之間的完整性。

(3)標簽元數據表設計
CREATE TABLE label (id INT PRIMARY KEY, ? ? ? ? ? ?-- 標簽唯一標識label VARCHAR(100), ? ? ? ? ? ?-- 標簽名稱category INT NOT NULL ? ? ? ? ?-- 標簽分類:標識頂點標簽還是邊標簽(例如:1=頂點,2=邊)
);
(4)無向圖處理方法

對于無向圖(Undirected Graph),可使用以下兩種策略之一:

  1. 對稱存儲:每條邊存儲兩次,分別是 (u → v)(v → u)

  2. 約束存儲順序:強制存儲一次,并約定 from_vertex < to_vertex,查詢時統一處理對稱性。


1 圖的基本結構相關概念

概念簡要說明
頂點(Vertex)圖中的節點,代表事物
邊(Edge)頂點之間的連接,代表關系
度(Degree)頂點的連接數目(有向圖分入度、出度)
權值(weight cost)頂點或邊的附加屬性
自環(Loop)一條連接自身的邊,如 (v, v)
重邊(Multiple Edge)多條連接同一對頂點的邊
鄰接(Adjacency)兩頂點之間有邊連接稱為鄰接
路徑(Path)一組連接頂點的邊序列
簡單路徑路徑中無重復頂點
環(Cycle)起點和終點相同的簡單路徑
簡單圖(Simple Graph)無自環、無重邊的圖
多重圖(Multigraph)允許重邊和/或自環
子圖(Subgraph)圖的頂點和邊的子集組成的圖
完全圖(Complete Graph)任意兩頂點之間都存在一條邊
稀疏圖/稠密圖邊的數量相對少/多
平面圖(Planar Graph)可以畫在平面上不相交的圖
偽圖(Pseudograph)允許重邊和自環的圖

2圖的類型和性質

概念簡要說明
有向圖(Directed Graph)邊有方向,表示從 u → v
無向圖(Undirected Graph)邊無方向,(u, v) 與 (v, u) 等價
加權圖(Weighted Graph)邊帶有權值,代表代價、距離等
非加權圖邊權相同或無權
連通圖(Connected Graph)任意兩頂點之間都有路徑(無向圖)
強連通圖(Strongly Connected)有向圖中任意兩頂點可達
弱連通圖有向圖忽略方向后連通
二分圖(Bipartite Graph)頂點集可分為兩部分,邊僅連接不同集合
森林(Forest)不含環的無向圖
樹(Tree)連通的無環無向圖
DAG(有向無環圖)沒有有向環的有向圖(常用于任務調度)
歐拉圖(Eulerian Graph)存在一條路徑遍歷每條邊恰好一次
哈密頓圖(Hamiltonian Graph)存在一條路徑遍歷每個頂點恰好一次

3 圖的遍歷與算法相關概念

概念簡要說明
深度優先遍歷(DFS)類似樹的先序遍歷
廣度優先遍歷(BFS)層次搜索方式
拓撲排序(Topological Sort)DAG 的頂點線性排序
連通分量(Connected Component)最大的連通子圖
割點(Articulation Point)刪除該點會使圖不連通
橋(Bridge)刪除這條邊會使圖不連通
圖染色(Graph Coloring)給圖的頂點上色,使相鄰點顏色不同
最小生成樹(Minimum Spanning Tree)覆蓋所有頂點、權值最小的樹
最短路徑(Shortest Path)頂點之間路徑權值最小
網絡流(Network Flow)求最大流/最小割等問題
匹配(Matching)二分圖中點之間的配對關系
圖同構(Graph Isomorphism)判斷兩個圖是否結構一致
圖壓縮(Graph Compression)將多個頂點合并成一個頂點

4 圖的矩陣表示與運算

概念簡要說明
鄰接矩陣(Adjacency Matrix)頂點對之間的連接關系
鄰接表(Adjacency List)每個頂點的鄰接頂點列表
關聯矩陣(Incidence Matrix)頂點和邊的對應關系
距離矩陣(Distance Matrix)所有頂點對之間的最短路徑長度
拉普拉斯矩陣(Laplacian Matrix)用于譜圖理論分析
權重矩陣(Weight Matrix)記錄邊權重
冪矩陣(A^k)表示頂點之間的 k 步路徑數量

5 高階圖模型與擴展概念

概念簡要說明
超圖(Hypergraph)一條邊可以連接多個頂點
動態圖(Dynamic Graph)圖結構隨時間變化
隨機場(Random Graph)邊的生成遵循概率模型(如 Erd?s–Rényi)
社區結構(Community)圖中頂點聚類成的子結構
小世界圖(Small-world)局部聚集 + 全局稀疏的圖模型
無標度圖(Scale-free)頂點度數滿足冪律分布

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92252.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92252.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92252.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

等保測評-Nginx中間件

Nginx *排查有無Nginx中間件&#xff0c;可使用以下命令&#xff1a; ps -ef | grep nginx、netstat -nutlp *確認Nginx中間件有運行&#xff0c;查看其目錄&#xff1a; find / -name nginx.conf、ps -ef | grep Nginx *確認好目錄后&#xff0c;查看版本&#xff1a; …

Milvus向量數據庫版本升級

創建時間&#xff1a;2025-3-11 更新時間&#xff1a;2025-8-8 作者&#xff1a;薄刀刀、散裝DBA 聯系方式&#xff1a;bulkdba&#xff0c;1511777 背景&#xff1a;當前版本無法使用分組搜索功能&#xff0c;通過升級版本解決&#xff0c;計劃將milvus升級到2.4.15&#xf…

若依前后端分離版學習筆記(六)——JWT

在上一節已經提到了傳統Session認證和JWT認證內容&#xff0c;這一節對JWT進行更加詳細的了解。 一 JWT介紹 1、傳統的session認證 1.1 傳統session認證流程 1.用戶向服務器發送用戶名和密碼 2.服務器通過驗證后&#xff0c;在當前對話&#xff08;session&#xff09;中保存相…

如何永久刪除三星手機中的照片?

如果你計劃出售你的三星 Galaxy 手機&#xff0c;或者整理其接近滿容量的存儲空間&#xff0c;你可能會擔心如何從設備中移除照片和其他文件。這對于確保你的個人信息保持安全至關重要&#xff0c;即使你選擇通過各種平臺捐贈或出售舊手機也是如此。在本文中&#xff0c;我們介…

【數字圖像處理系列筆記】Ch06:圖像壓縮

一、基礎知識信源編碼器&#xff1a;減少或消除輸入圖像中的編碼冗余、像素 間冗余以及心理視覺冗余。 數據的冗余 一、空間冗余&#xff08;Spatial Redundancy&#xff09;1. 定義圖像中相鄰像素間的強相關性導致的冗余 —— 同一區域內相鄰像素的像素值&#xff08;如灰度、…

windows線程基礎

Windows線程機制詳解 線程的基本概念 在Windows操作系統中&#xff0c;線程是程序執行的最小單位。每個進程至少包含一個線程&#xff08;主線程&#xff09;&#xff0c;但可以創建多個線程來并行執行任務。線程與進程的主要區別在于&#xff1a; 資源分配&#xff1a;進程擁有…

Numpy科學計算與數據分析:Numpy隨機數生成入門

Numpy隨機數生成實戰 學習目標 通過本課程&#xff0c;學員將掌握如何使用Numpy庫生成不同類型的隨機數&#xff0c;包括隨機整數、隨機浮點數以及從特定分布中抽樣的方法。本課程將通過理論講解與實踐操作相結合的方式&#xff0c;幫助學員深入理解Numpy在隨機數生成方面的強…

使用 C# 通過 .NET 框架開發應用程序的安裝與環境配置

文章目錄1. .NET介紹2. IDE2.1 Rider 安裝2.2 Visual Studio 安裝3. SDK安裝與環境配置3.1 單獨下載安裝 .NET SDK3.2 Visual Studio 工作負荷安裝SDK4. 相關問題4.1 我以前使用 Unity 寫 C# 腳本不需要額外的編譯器&#xff0c;為什么現在需要&#xff1f;1. .NET介紹 .NET 是…

Scikit-learn - 機器學習庫初步了解

目錄1. 主要算法分類1.1 監督學習 (Supervised Learning)1.2 非監督學習 (Unsupervised Learning)1.3 半監督學習 (Semi-Supervised Learning)1.4 強化學習 (Reinforcement Learning)1.5 遺傳算法 (Genetic Algorithm)2. 選擇合適的機器學習模型2.1 分類 (Classification)2.2 回…

關于 idea 里 properties 文件的中文亂碼問題

背景 你會發現 properties 文件里的中文可能會出現亂碼。 這個因為 properties 規范是使用 iso-8859-1 存儲的&#xff0c;不支持中文&#xff08;也不支持西歐里法語、德語里奇怪的字母&#xff09; properties 的標準制定于很早&#xff0c;所以沒考慮這么多&#xff0c;prop…

BVH文件 解析 解讀的python第三方類庫 推薦

我們面臨多個第三方庫選項用于解析BVH文件&#xff0c;根據您的列表&#xff0c;我將分析幾個關鍵庫的特點&#xff0c;并推薦最適合當前任務的庫。我們將基于以下標準進行選擇&#xff1a; ??功能性??&#xff1a;是否能準確解析關節角度數據&#xff0c;支持關鍵幀操作 ?…

uni-app X能成為下一個Flutter嗎?

哈嘍&#xff0c;我是老劉 老劉使用Flutter作為客戶端主要技術棧的這六七年的時間里&#xff0c;關于跨平臺開發的爭議和新技術始終沒有停過。 “一套代碼&#xff0c;多端運行”——這個讓無數開發者心動的承諾&#xff0c;究竟是技術革命還是美麗的謊言&#xff1f; 想象一…

Spring Cloud Gateway全棧實踐:動態路由能力與WebFlux深度整合

一、為什么需要下一代網關&#xff1f; 傳統網關的三大瓶頸&#xff1a; #mermaid-svg-Kdei9Io6KntYGQc4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Kdei9Io6KntYGQc4 .error-icon{fill:#552222;}#mermaid-svg-…

MongoDB數據存儲界的瑞士軍刀:cpolar內網穿透實驗室第513號挑戰

軟件名稱&#xff1a;MongoDB 操作系統支持&#xff1a;Linux、Windows、macOS&#xff08;Docker版全平臺通用&#xff01;&#xff09; 軟件介紹&#xff1a; MongoDB是一個基于分布式架構的NoSQL數據庫&#xff0c;擅長處理復雜數據類型&#xff08;如嵌套對象、數組&…

SPI TFT全彩屏幕驅動開發及調試

簡介SPI&#xff08;Serial Peripheral Interface&#xff09;是一種廣泛使用的串行通信協議&#xff0c;常用于微控制器&#xff08;MCU&#xff09;與外圍設備&#xff08;如傳感器、顯示屏、存儲器等&#xff09;之間的通信。SPI具有全雙工傳輸、主從結構和較高的傳輸速率&a…

Linux學習—數據結構(鏈表2)

1.單向鏈表6.鏈表的查找在鏈表中找到指定的第一個元素沿用遍歷思想&#xff0c;每次訪問一個節點元素判斷是否為要找的節點符合條件返回該節點地址到最后沒有找到符號條件的節NULLlinknode *find_linklist(linknode *phead, datatype tmpdata) {linknode *ptmpnode NULL;ptmpn…

MySQL 備份利器 Xtrabackup 全解析:從部署到恢復的實戰指南

數據庫備份恢復是 DBA 的 “保命” 技能&#xff0c;生產業務不僅要保證有合適的備份策略&#xff0c;也要定期驗證備份的有效性和恢復演練流程&#xff0c;因為數據恢復和驗證可能會涉及多方合作&#xff0c;演練可以讓災難真正發生時&#xff0c;多方配合有條不紊的將數據恢復…

EAGLE-2:通過動態草稿樹加速語言模型推理

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" EAGLE-2&#xff1a;通過動態草稿樹加速語言模型推理 摘要 現代 Large Language Models&#xff08;LLMs&#xff09;的推理過程既昂貴又耗時&#xff0c;而 speculative sampling 已被證明是一種有效的解決方案…

防水防塵防摔性能很好的智能三防手機,還有22000mAh大電池

在電力巡檢的崇山峻嶺間&#xff0c;在野外地質勘探的風沙深處&#xff0c;在應急救援的急風驟雨里&#xff0c;傳統智能設備因其固有的脆弱性與續航短板往往力不從心&#xff0c;甚至成為保障工作連續性的掣肘。而真正的智能三防手機應是一堵移動的堡壘&#xff0c;集堅不可摧…

Charles中文版抓包工具使用指南 提高API調試和網絡優化效率

在現代開發過程中&#xff0c;調試API、捕獲HTTP/HTTPS流量和優化應用的網絡性能已經成為開發者的常見任務。尤其是在調試復雜的API接口和分析網絡請求時&#xff0c;開發者需要一款高效且功能強大的工具。Charles抓包工具憑借其強大的網絡調試功能和易用的操作界面&#xff0c…