數據結構的圖存儲結構

目錄

數據結構的圖存儲結構

圖存儲結構基本常識

弧頭和弧尾

入度和出度

(V1,V2) 和 的區別,v2>

集合 VR 的含義

路徑和回路

權和網的含義

圖存儲結構的分類

什么是連通圖,(強)連通圖詳解

強連通圖

什么是生成樹,生成樹(生成森林)詳解

生成森林


數據結構的圖存儲結構

我們知道,數據之間的關系有 3 種,分別是 "一對一"、"一對多" 和 "多對多",前兩種關系的數據可分別用線性表和樹結構存儲,本節學習存儲具有"多對多"邏輯關系數據的結構——圖存儲結構。


?

圖存儲結構示意圖


圖 1 圖存儲結構示意圖


圖 1 所示為存儲 V1、V2、V3、V4 的圖結構,從圖中可以清楚的看出數據之間具有的"多對多"關系。例如,V1 與 V4 和 V2 建立著聯系,V4 與 V1 和 V3 建立著聯系,以此類推。

與鏈表不同,圖中存儲的各個數據元素被稱為頂點(而不是節點)。拿圖 1 來說,該圖中含有 4 個頂點,分別為頂點 V1、V2、V3 和 V4。

圖存儲結構中,習慣上用 Vi 表示圖中的頂點,且所有頂點構成的集合通常用 V 表示,如圖 1 中頂點的集合為 V={V1,V2,V3,V4}。


注意,圖 1 中的圖僅是圖存儲結構的其中一種,數據之間 "多對多" 的關系還可能用如圖 2 所示的圖結構表示:


?

有向圖示意圖


圖 2 有向圖示意圖


可以看到,各個頂點之間的關系并不是"雙向"的。比如,V4 只與 V1 存在聯系(從 V4 可直接找到 V1),而與 V3 沒有直接聯系;同樣,V3 只與 V4 存在聯系(從 V3 可直接找到 V4),而與 V1 沒有直接聯系,以此類推。

因此,圖存儲結構可細分兩種表現類型,分別為無向圖(圖 1)和有向圖(圖 2)。

圖存儲結構基本常識

弧頭和弧尾

有向圖中,無箭頭一端的頂點通常被稱為"初始點"或"弧尾",箭頭直線的頂點被稱為"終端點"或"弧頭"。

入度和出度

對于有向圖中的一個頂點 V 來說,箭頭指向 V 的弧的數量為 V 的入度(InDegree,記為 ID(V));箭頭遠離 V 的弧的數量為 V 的出度(OutDegree,記為OD(V))。拿圖 2 中的頂點 V1來說,該頂點的入度為 1,出度為 2(該頂點的度為 3)。

(V1,V2) 和 <V1,V2> 的區別

無向圖中描述兩頂點(V1 和 V2)之間的關系可以用 (V1,V2) 來表示,

而有向圖中描述從 V1 到 V2 的"單向"關系用 <V1,V2> 來表示。

由于圖存儲結構中頂點之間的關系是用線來表示的,因此 (V1,V2) 還可以用來表示無向圖中連接 V1 和 V2 的線,又稱為邊;同樣,<V1,V2> 也可用來表示有向圖中從 V1 到 V2 帶方向的線,又稱為弧。

集合 VR 的含義

并且,圖中習慣用 VR 表示圖中所有頂點之間關系的集合。例如,圖 1 中無向圖的集合 VR={(v1,v2),(v1,v4),(v1,v3),(v3,v4)},圖 2 中有向圖的集合 VR={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>}。

路徑和回路

無論是無向圖還是有向圖,從一個頂點到另一頂點途徑的所有頂點組成的序列(包含這兩個頂點),稱為一條路徑。如果路徑中第一個頂點和最后一個頂點相同,則此路徑稱為"回路"(或"環")。

并且,若路徑中各頂點都不重復,此路徑又被稱為"簡單路徑";同樣,若回路中的頂點互不重復,此回路被稱為"簡單回路"(或簡單環)。

拿圖 1 來說,從 V1 存在一條路徑還可以回到 V1,此路徑為 {V1,V3,V4,V1},這是一個回路(環),而且還是一個簡單回路(簡單環)。

在有向圖中,每條路徑或回路都是有方向的。

權和網的含義

在某些實際場景中,圖中的每條邊(或弧)會賦予一個實數來表示一定的含義,這種與邊(或弧)相匹配的實數被稱為"權",而帶權的圖通常稱為網。如圖 3 所示,就是一個網結構:


?

帶權的圖存儲結構


圖 3 帶權的圖存儲結構


子圖:指的是由圖中一部分頂點和邊構成的圖,稱為原圖的子圖。

圖存儲結構的分類

根據不同的特征,圖又可分為完全圖,連通圖、稀疏圖和稠密圖:

完全圖:若圖中各個頂點都與除自身外的其他頂點有關系,這樣的無向圖稱為完全圖(如圖 4a))。同時,滿足此條件的有向圖則稱為有向完全圖(圖 4b))。


?

完全圖示意圖


圖 4 完全圖示意圖

具有 n 個頂點的完全圖,圖中邊的數量為 n(n-1)/2;

對于具有 n 個頂點的有向完全圖,圖中弧的數量為 n(n-1)。

  • 稀疏圖和稠密圖:這兩種圖是相對存在的,即如果圖中具有很少的邊(或弧),此圖就稱為"稀疏圖";反之,則稱此圖為"稠密圖"。

    稀疏和稠密的判斷條件是:e<nlogn,其中 e 表示圖中邊(或弧)的數量,n 表示圖中頂點的數量。如果式子成立,則為稀疏圖;反之為稠密圖。

什么是連通圖,(強)連通圖詳解


前面講過,圖中從一個頂點到達另一頂點,若存在至少一條路徑,則稱這兩個頂點是連通著的。例如圖 1 中,雖然 V1 和 V3 沒有直接關聯,但從 V1 到 V3 存在兩條路徑,分別是?V1-V2-V3?和?V1-V4-V3,因此稱 V1 和 V3 之間是連通的。


?

頂點之間的連通狀態示意圖


圖 1 頂點之間的連通狀態示意圖


無向圖中,如果任意兩個頂點之間都能夠連通,則稱此無向圖為連通圖。例如,圖 2 中的無向圖就是一個連通圖,因為此圖中任意兩頂點之間都是連通的。


?

連通圖示意圖


圖 2 連通圖示意圖


若無向圖不是連通圖,但圖中存儲某個子圖符合連通圖的性質,則稱該子圖為連通分量

前面講過,由圖中部分頂點和邊構成的圖為該圖的一個子圖,但這里的子圖指的是圖中"最大"的連通子圖(也稱"極大連通子圖")。

如圖 3 所示,雖然圖 3a) 中的無向圖不是連通圖,但可以將其分解為 3 個"最大子圖"(圖 3b)),它們都滿足連通圖的性質,因此都是連通分量。


?


圖 3 連通分量示意圖

提示,圖 3a) 中的無向圖只能分解為 3 部分各自連通的"最大子圖"。

需要注意的是,連通分量的提出是以"整個無向圖不是連通圖"為前提的,因為如果無向圖是連通圖,則其無法分解出多個最大連通子圖,因為圖中所有的頂點之間都是連通的。

強連通圖

有向圖中,若任意兩個頂點 Vi 和 Vj,滿足從 Vi 到 Vj 以及從 Vj 到 Vi 都連通,也就是都含有至少一條通路,則稱此有向圖為強連通圖。如圖 4 所示就是一個強連通圖。


?

強連通圖


圖 4 強連通圖


與此同時,若有向圖本身不是強連通圖,但其包含的最大連通子圖具有強連通圖的性質,則稱該子圖為強連通分量。


?

強連通分量


圖 5 強連通分量


如圖 5 所示,整個有向圖雖不是強連通圖,但其含有兩個強連通分量。

可以這樣說,連通圖是在無向圖的基礎上對圖中頂點之間的連通做了更高的要求,而強連通圖是在有向圖的基礎上對圖中頂點的連通做了更高的要求。

什么是生成樹,生成樹(生成森林)詳解

對連通圖進行遍歷,過程中所經過的邊和頂點的組合可看做是一棵普通樹,通常稱為生成樹。


?

連通圖及其對應的生成樹


圖 1 連通圖及其對應的生成樹


如圖 1 所示,圖 1a) 是一張連通圖,圖 1b) 是其對應的 2 種生成樹。

連通圖中,由于任意兩頂點之間可能含有多條通路,遍歷連通圖的方式有多種,往往一張連通圖可能有多種不同的生成樹與之對應。

連通圖中的生成樹必須滿足以下 2 個條件:

  1. 包含連通圖中所有的頂點;
  2. 任意兩頂點之間有且僅有一條通路;


因此,連通圖的生成樹具有這樣的特征,即生成樹中邊的數量 = 頂點數 - 1

生成森林

生成樹是對應連通圖來說

而生成森林是對應非連通圖來說的。

我們知道,非連通圖可分解為多個連通分量,而每個連通分量又各自對應多個生成樹(至少是 1 棵),因此與整個非連通圖相對應的,是由多棵生成樹組成的生成森林。


?

非連通圖和連通分量


圖 2 非連通圖和連通分量


如圖 2 所示,這是一張非連通圖,可分解為 3 個連通分量,其中各個連通分量對應的生成樹如圖 3 所示:


?

生成森林


圖 3 生成森林

注意,圖 3 中列出的僅是各個連通分量的其中一種生成樹。

因此,多個連通分量對應的多棵生成樹就構成了整個非連通圖的生成森林。

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

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

相關文章

springboot集成ES

1.引入pom依賴2.application 配置3.JavaBean配置以及ES相關注解 3.1 Student實體類3.2 Teacher實體類3.3 Headmaster 實體類4. 啟動類配置5.elasticsearchRestTemplate 新增 5.1 createIndex && putMapping 創建索引及映射 5.1.1 Controller層5.1.2 service層5.1.3 ser…

leetcode做題筆記85最大矩形

給定一個僅包含 0 和 1 、大小為 rows x cols 的二維二進制矩陣&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面積。 示例 1&#xff1a; 思路一&#xff1a;單調棧 int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){int dp[matrixSize…

使用MAT分析OOM問題

OOM和內存泄漏在我們的工作中&#xff0c;算是相對比較容易出現的問題&#xff0c;一旦出現了這個問題&#xff0c;我們就需要對堆進行分析。 一般情況下&#xff0c;我們生產應用都會設置這樣的JVM參數&#xff0c;以便在出現OOM時&#xff0c;可以dump出堆內存文件&#xff…

基于libevent的tcp服務器

libevent使用教程_evutil_make_socket_nonblocking_易方達藍籌的博客-CSDN博客 一、準備 centos7下安裝libevent庫 yum install libevent yum install -y libevent-devel 二、代碼 server.cpp /** You need libevent2 to compile this piece of code Please see: http://li…

專訪 BlockPI:共建賬戶抽象未來的新一代 RPC 基礎設施

在傳統 RPC 服務板塊上&#xff0c;開發者一直飽受故障風險、運行環境混亂等難題的折磨。實現 RPC 服務的去中心化&#xff0c;且保持成本優勢和可擴展性&#xff0c;始終是區塊鏈基礎設施建設的重要命題之一。從 2018 年觀察中心化 RPC 供應商服務現狀開始&#xff0c;BlockPI…

內存管理(1)

內存管理&#xff08;1&#xff09; 1、各類型數據在內存中的存儲空間2、C內存管理方式2.1 針對于內置類型分析2.2 針對于自定義類型分析2.3 C語言與C在申請動態內存失敗時的區別 3、operator new 和 operator delete函數&#xff08;重點&#xff09;3.1 底層知識解析3.2 實現…

linux-shell腳本收集

創建同步腳本xsync mkdir -p /home/hadoop/bin && cd /home/hadoop/bin vim xsync#!/bin/bash#1. 判斷參數個數 if [ $# -lt 1 ] thenecho Not Arguementexit; fi#2. 遍歷集群所有機器 for host in node1 node2 node3 doecho $host #3. 遍歷所有目錄&#xff0c;挨…

web3:使用Docker-compose方式部署blockscout

最近做的項目,需要blockscout來部署一個區塊鏈瀏覽器,至于blockscout是什么,咱們稍后出一篇文章專門介紹下,本次就先介紹一下如何使用Docker-compose方式部署blockscout,以及過程中遇到的種種坑 目錄 先決條件我的環境準備工作Docker-compose1.安裝方式一:下載 Docker Co…

財務數據分析之現金流量表模板分享

現金流量表是我們常說的財務數據分析三表之一。它可以呈現一個企業的現金流情況&#xff0c;揭示企業經營管理健康狀態&#xff0c;但在實際使用中卻有總給人一種用不上、用不好的矛盾感。怎么才能把現金流量表做好&#xff1f;不如借鑒下大神的現金流量表模板。 下面介紹的是…

RabbitMQ-消息中間件學習記錄(what-how-why)

什么是消息中間件 簡單的來說就是消息隊列中間件&#xff0c;生產者發送消息到中間件&#xff0c;消息中間件用于 保存消息并發送消息到消費者。 消息中間件RabbitMQ的基本組件 1&#xff09;producer -生產者 2&#xff09;customer -消費者 3&#xff09;broker (經紀人)- M…

【Java 動態數據統計圖】動態數據統計思路案例(動態,排序,數組)四(116)

需求&#xff1a;&#xff1a;前端根據后端的返回數據&#xff1a;畫統計圖&#xff1b; 1.動態獲取地域數據以及數據中的平均值&#xff0c;按照平均值降序排序&#xff1b; 說明&#xff1a; X軸是動態的&#xff0c;有對應區域數據則展示&#xff1b; X軸 區域數據降序排序…

LabVIEW調用DLL傳遞結構體參數

LabVIEW 中調用動態庫接口時&#xff0c;如果是值傳遞的結構體&#xff0c;可以根據字段拆解為多個參數&#xff1b;如果參數為結構體指針&#xff0c;可用簇&#xff08;Cluster&#xff09;來匹配&#xff0c;其內存連續相當于單字節對齊。 1.值傳遞 接口定義&#xff1a; …

【FAQ】調用視頻匯聚平臺EasyCVR的iframe地址,視頻無法播放的原因排查

有用戶反饋&#xff0c;在調用iframe地址后嵌入用戶自己的前端頁面&#xff0c;視頻無法播放并且要求登錄。 安防監控視頻匯聚平臺EasyCVR基于云邊端一體化架構&#xff0c;具有強大的數據接入、處理及分發能力&#xff0c;可提供視頻監控直播、云端錄像、視頻云存儲、視頻集中…

視頻集中存儲EasyCVR視頻匯聚平臺定制項目增加AI智能算法

安防視頻集中存儲EasyCVR視頻匯聚平臺&#xff0c;可支持海量視頻的輕量化接入與匯聚管理。平臺能提供視頻存儲磁盤陣列、視頻監控直播、視頻輪播、視頻錄像、云存儲、回放與檢索、智能告警、服務器集群、語音對講、云臺控制、電子地圖、平臺級聯、H.265自動轉碼等功能。為了便…

【Unity每日一記】Physics.Raycast 相關_Unity中的“X光射線”

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 收錄于專欄&#xff1a;uni…

05_bitmaphyperloglogGEO

Bitmap&hyperloglog&GEO 面試問 記錄對集合中的數據進行統計在移動應用中&#xff0c;需要統計每天的新增用戶數和第2天的留存用戶數&#xff1b;在電商網站的商品評論中&#xff0c;需要統計評論列表中的最新評論&#xff1a;在簽到打卡中&#xff0c;需要統計一個月內…

Python “貪吃蛇”游戲,在不斷改進中學習pygame編程

目錄 前言 改進過程一 增加提示信息 原版幫助摘要 pygame.draw pygame.font class Rect class Surface 改進過程二 增加顯示得分 改進過程三 增加背景景樂 增加提示音效 音樂切換 靜音切換 mixer.music.play 注意事項 原版幫助摘要 pygame.mixer pygame.mix…

kvm和vmware有什么區別?如何選擇?

一、kvm和vmware的區別 VMware vSphere 平臺 VMware 可以提供 ESXi 虛擬機監控程序和 vSphere 虛擬化平臺。VMware ESXi 是一個能夠直接安裝到物理服務器上的裸機虛擬機監控程序&#xff0c;可以幫你整合硬件。你可以用 VMware 的虛擬化技術來創建和部署虛擬機&#xff08;VM…

HTML詳解連載(7)

HTML詳解連載&#xff08;7&#xff09; 專欄鏈接 [link](http://t.csdn.cn/xF0H3)下面進行專欄介紹 開始嘍結構偽類選擇器作用 :nth-child&#xff08;公式&#xff09;作用舉例 偽元素選擇器作用注意&#xff1a; PxCoook作用盒子模型-重要組成部分 盒子模型-邊框線屬性名屬性…

excel中定位條件,excel中有哪些數據類型、excel常見錯誤值、查找與替換

一、如何定位條件 操作步驟&#xff1a;開始 - 查找和選擇 - 定位條件&#xff08;ctrl G 或 F5&#xff09; 注&#xff1a;如果F5不可用&#xff0c;可能是這個快捷鍵被占用了 案例&#xff1a;使用定位條件選擇取余中空單元格&#xff0c;填入100&#xff0c;按組合鍵ct…