數據結構 -- 圖的存儲

圖的存儲

鄰接矩陣法

鄰接矩陣存儲不帶權圖

0 - 表示兩個頂點不鄰接

1 - 表示兩個頂點鄰接

在無向圖中,每條邊在矩陣中對應兩個1

在有向圖中,每條邊在矩陣中對應一個1

//不帶權圖的鄰接矩陣存儲
#define MaxVertexNum 100		//頂點數目的最大值
typedef struct{char Vex[MaxVertexNum];int Edge[MaxVertexNum][MaxVertexNum];		//鄰接矩陣,邊表int vexnum,arcnum;			//圖當前頂點數和邊數/弧數
}MGraph;

因為矩陣中只需要存放0和1,所以也可以將Edge(二維數組)定義為bool類型或枚舉類型,讓矩陣變得更小,節省存儲空間

求頂點的度、入度、出度

無向圖:第i個頂點的度 = 第i行(或第i列)的非零元素個數 時間復雜度O(|V|)

有向圖:第i個頂點的入度 = 第i行的非零元素個數 時間復雜度O(|V|)

? 第i個頂點的出度 = 第i列的非零元素個數 時間復雜度O(|V|)

? 第i個頂點的度 = 第i行和第i列的非零元素個數之和 時間復雜度O(|V|)

鄰接矩陣存儲帶權圖(網)
//鄰接矩陣存儲帶權圖(網)
#define MaxVertexNum 100		//頂點數目的最大值
#define INFINITY 最大的int//宏定義常量“無窮”		使用int的上限值表示“無窮”
typedef char VertexType;		//頂點的數據類型
typedef int EdgeType;			//帶權圖中邊上權值的數據類型
typedef struct{VertexType Vex[MaxVertexNum];			//頂點EdgeType Edge[MaxVertexNum][MaxVertexNum];		//邊的權int vexnum,arcnum;			//圖的當前定點數和弧數
}

若兩個頂點間沒有邊,則權值為無窮

也有一些教材將一個頂點與自身的權值記作0,所以在使用鄰接矩陣表示帶權圖(網)時,如果兩個點之間權值為0或∞,則代表這兩個頂點間沒有邊

鄰接矩陣法的性能分析

空間復雜度:O(|V|2) – 只和頂點數相關,和實際邊數無關

當邊數較少時,有大量的空間被浪費,所以鄰接矩陣法適用于存儲稠密圖

無向圖的鄰接矩陣是對稱矩陣,可以進行壓縮存儲(只存儲上三角區/下三角區)

鄰接矩陣的性質

設圖G的鄰接矩陣為A(矩陣元素為0/1),則An的元素An[i][j]等于由頂點i到頂點j的長度為n的路徑的數目

鄰接表法(順序+鏈式存儲)

//用鄰接表存儲的圖
typedef struct{AdjList vertices;int vexnum,arcnum;
}ALGraph;
//頂點
typedef struct VNode{VertexType data;	//頂點信息ArcNode *first;		//第一條邊/弧    
}VNode,AdjList[MaxVertexNum];
//“邊/弧”
typedef struct ArcNode{int adjvex;		//邊/弧指向哪個結點struct ArcNode *next;		//指向下一條弧的指針//InfoType info			//邊權值
}ArcNode;//與樹的孩子表示法相同

空間復雜度

無向圖:邊結點的數量為2|E|,整體的空間復雜度為O(|V|+2|E|)

有向圖:邊結點的數量為|E|,整體的空間復雜度為O(|V|+|E|)

求頂點的度、入度、出度

無向圖:度 = 頂點指向的邊鏈表中結點的數量

有向圖:度 = 入度 + 出度

? 出度 = 頂點指向的邊鏈表中結點的數量

? 入度 = 指向當前結點的弧的數量(需要遍歷所有結點的邊鏈表)

同一個圖的鄰接表表示方式不唯一(邊鏈表各結點的順序是任意的)

鄰接表和鄰接矩陣
鄰接表鄰接矩陣
空間復雜度無向圖:O(|V|+2|E|);有向圖:O(|V|+|E|)O(|V|2)
適用于存儲稀疏圖存儲稠密圖
表示方式不唯一唯一
計算度/入度/出度計算有向圖的度和入度不方便,其余很方便必須遍歷對應的行和列
找相鄰的邊找有向圖的入邊不方便,其余很方便必須遍歷對應的行和列

十字鏈表法、鄰接多重表

十字鏈表法(存儲有向圖)

【有向圖存儲】

鄰接表:入度、入邊尋找計算不方便

鄰接矩陣:空間復雜度高

在這里插入圖片描述
在這里插入圖片描述

空間復雜度:O(|V|+|E|)

找出邊:順著綠色線路找

找入邊:順著橙色路線找

注意:十字鏈表法只能用于存儲有向圖

鄰接多重表(存儲無向圖)

【存儲無向圖】

鄰接表:每條邊對應兩份冗余信息,刪除頂點、刪除邊時間復雜度高

鄰接矩陣:空間復雜度高

在這里插入圖片描述

空間復雜度:O(|V|+|E|)

刪除邊、刪除節點等操作很方便

注意:鄰接多重表只適用于存儲無向圖

小結
鄰接表鄰接矩陣十字鏈表法鄰接多重表
空間復雜度無向圖:O(|V|+2|E|);有向圖:O(|V|+|E|)O(|V|2)O(|V|+|E|)O(|V|+|E|)
適用于存儲稀疏圖存儲稠密圖只能存有向圖只能存無向圖
表示方式不唯一唯一不唯一不唯一
刪除邊或頂點無向圖中刪除邊或刪除頂點都不方便刪除邊很方便,刪除頂點需要大量移動數據很方便很方便
找相鄰的邊找有向圖的入邊必須遍歷整個鄰接表遍歷對應行或列,時間復雜度O(|V|)很方便很方便

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

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

相關文章

25.4.4錯題分析

計算機組成原理 總線特點 考察總線特點,串行總線,一次只傳1bit,采用單條電纜,抗干擾能力強,傳輸距離較遠,成本低,但傳輸速度慢,延遲較高,不適用大規模數據傳輸 并行總線…

規則引擎Drools

1.規則引擎概述 1.1 什么是規則引擎 規則引擎 全稱為業務規則管理系統,英文名為BRMS,規則引擎的主要思想是將應用程序中的業務決策部分分離出來,并使用預定義的語義模塊編寫業務規則,由用戶或開發者在需要時進行配置和管理。 需…

框架PasteForm實際開發案例,換個口味顯示數據,支持echarts,只需要標記幾個特性即可在管理端顯示(2)

PasteForm框架的主要思想就是對Dto進行標記特性,然后管理端的頁面就會以不一樣的UI呈現 使用PasteForm框架開發,讓你免去開發管理端的煩惱,你只需要專注于業務端和用戶端! 在管理端中,如果說表格是基本的顯示方式,那么圖表chart就是一個錦上添花的體現! 如果一個項目擁…

【工具】在 Visual Studio 中使用 Dotfuscator 對“C# 類庫(DLL)或應用程序(EXE)”進行混淆

在 Visual Studio 中使用 Dotfuscator 進行混淆 Dotfuscator 是 Visual Studio 自帶的混淆工具(Dotfuscator Community Edition,簡稱 CE)。它可以混淆 C# 類庫(DLL)或應用程序(EXE)&#xff0c…

線程同步與互斥(上)

上一篇:線程概念與控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我們學習了線程的控制及其相關概念之后&#…

[Linux系統編程]進程信號

進程信號 1. 信號入門1.1 信號基本概念1.2 技術應用角度的信號2. 信號的產生2.1 通過終端按鍵(如鍵盤)產生信號2.2 通過異常產生信號2.3 調用系統函數向進程發信號2.4 由軟件條件產生信號2.5 總結3. 阻塞信號3.1 信號其他相關常見概念3.2 內核中的信號表示3.3 sigset_t3.3.1 …

要素的選擇與轉出

1.要素選擇的三種方式 當要在已有的數據中選擇部分要素時,ArcMap提供了三種方式:按屬性選擇、位置選擇及按圖形選擇。 1)按屬性選擇 通過設置 SQL查詢表達式,用來選擇與選擇條件匹配的要素。 (1)單擊主菜單下【選擇】【按屬性選擇】,打開【按…

Springboot + Vue + WebSocket + Notification實現消息推送功能

實現功能 基于Springboot與Vue架構,首先使用Websocket實現頻道訂閱,在實現點對點與群發功能后,在前端調用windows自帶的消息通知,實現推送功能。 開發環境 Springboot 2.6.7vue 2.6.11socket-client 1.0.0 準備工作 在 Vue.js…

云手機如何防止設備指紋被篡改

云手機如何防止設備指紋被篡改 云手機作為虛擬化設備,其設備指紋的防篡改能力直接關系到賬戶安全、反欺詐和隱私保護。以下以亞矩陣云手機為例,講解云手機防止設備指紋被篡改的核心技術及實現方式: 系統層加固:硬件級安全防護 1…

有人DTU使用MQTT協議控制Modbus協議的下位機-含數據庫

本文為備忘錄,不做太多解釋。 DTU型號:G780 服務器:win2018 一。DTU設置 正確設置波特率,進入配置狀態,獲取當前參數,修改參數,設置并保存所有參數。 1.通道1設置 2.Modbus輪詢設置 二&am…

湖北師范大學計信學院研究生課程《工程倫理》9.6章節練習

以下是圖片中識別出的文字內容: 1【單選題】當工程師發現所在的企業或公司進行的工程活動會對環境、社會和公眾的人身安全產生危害時,應該及時地給予反映或揭發。這屬于工程師的( ) A、職業倫理責任 B、社會倫理責任 C、個人倫理責任 D、法律責任 2【單選題】下列哪個不屬于工…

Axure RP 9 詳細圖文安裝流程(附安裝包)教程包含下載、安裝、漢化、授權

文章目錄 前言一、Axure RP 9介紹二、Axure RP 9 安裝流程1. Axure RP 9 下載2. 啟動安裝程序3. 安裝向導操作4.完成安裝 三、Axure RP 9 漢化四、Axure RP 9授權 前言 本基礎安裝流程教程,將以清晰、詳盡且易于遵循的步驟介紹Axure RP 9 詳細圖文安裝流程&#xf…

SpringBoot全局exception處理最佳實踐

目錄 自定義異常類 拋出異常 全局異常處理器 自定義異常類 通常會繼承 Exception 或其子類(如 RuntimeException)來定義業務異常類,用于封裝業務相關的錯誤信息。一般選擇繼承 RuntimeException,因為它是一個非受檢異常,在方法中拋出時不需要顯式聲明。 // 自定義業…

node ---- 解決錯誤【Error: error:0308010C:digital envelope routines::unsupported】

1. 報錯 在 Node.js 18.18.0 的版本中,遇到以下錯誤: this[kHandle] new _Hash(algorithm, xofLen);^ Error: error:0308010C:digital envelope routines::unsupported這個錯誤通常發生在運行項目或構建時,尤其是在使用 Webpack、Vite 或其他…

浙江大學鄭小林教授解讀智能金融與AI的未來|附PPT下載方法

導 讀INTRODUCTION 隨著人工智能技術的飛速發展,智能金融已成為金融行業的重要變革力量。浙江大學人工智能研究所的鄭小林教授在2025年3月24日的《智能金融:AI驅動的金融變革》講座中,深入探討了新一代人工智能在金融領域的應用及未來展望。 …

如何實現瀏覽器中的報表打印

在瀏覽器中實現打印一個報表,可以通過以下幾種方法來完成。這里介紹一個基本的流程和相關代碼示例: 1. 使用 JavaScript 的 window.print() 方法 這是最簡單的方法,它會打開打印對話框,讓用戶選擇打印選項。 示例代碼&#xff1…

Linux系統調用編程

進程和線程 進程是操作系統資源分配的基本單位,擁有獨立的地址空間、內存、文件描述符等資源,進程間相互隔離。每個進程由程序代碼、數據段和進程控制塊(PCB)組成,PCB記錄了進程狀態、資源分配等信息。 線程是…

【力扣hot100題】(054)全排列

挺經典的回溯題的。 class Solution { public:vector<vector<int>> result;void recursion(vector<int>& nums,vector<int>& now){if(nums.size()0){result.push_back(now);return ;}for(int i0;i<nums.size();i){now.push_back(nums[i]);…

【Ragflow】11. 文件解析流程分析/批量解析實現

概述 本文繼續對ragflow文檔解析部分進行分析&#xff0c;并通過腳本的方式實現對文件的批量上傳解析。 文件解析流程 文件解析的請求處理流程大致如下&#xff1a; 1.前端上傳文件&#xff0c;通過v1/document/run接口&#xff0c;發起文件解析請求 2.后端api\apps\docum…

2024年零知識證明(ZK)研究進展

Sumcheck 整個領域正在轉向更多地依賴于 Sumcheck Protocol Sumcheck是用于驗證多項式承諾的協議,常用于零知識證明(ZKP)中,尤其是在可驗證計算和擴展性上。它的主要目的是通過對多項式進行分段檢查,從而保證某個多項式在給定輸入上的正確性,而不需要直接計算出整個多項…