C++語言的并查集

并查集(Union-Find)在C++中的實現與應用

引言

并查集(Union-Find),又稱為不相交集合(Disjoint Set),是一種用于處理動態連通性問題的數據結構。它的主要功能包括合并兩個集合(Union)和查找某個元素所屬的集合(Find)。并查集在圖論、網絡連接、群體分析等問題中廣泛應用,尤其在算法優化中具備極高的價值。本文將探討并查集的基本原理、C++實現以及應用場景。

一、并查集的基本原理

并查集的核心思想是對每個元素進行標識,通常使用整數表示每個元素,它們對應于一個個集合。通過維護一個指向集合領頭元素的數組(通常稱為父數組),并利用路徑壓縮和按秩合并等優化技術,提高查找和合并操作的效率。

1.1 數據結構

并查集通常使用兩個數組來實現:

  • parent數組:表示每個元素的父節點,parent[i]指向元素i的父元素。
  • rank數組:表示每個集合的秩(深度),用于優化合并操作,避免樹的高度過高。

1.2 基本操作

  1. 查找(Find):找到元素所在的集合的代表元素,并進行路徑壓縮,以降低樹的高度。
  2. 合并(Union):將兩個不同的集合合并為一個集合,通過比較兩個集合的秩來決定合并的方式。

1.3 操作復雜度

通過路徑壓縮和按秩合并,查找和合并操作的時間復雜度可以達到接近常數級別,即O(α(n)),其中α(n)是阿克曼函數的反函數,增長極其緩慢,對于常用規模的n,幾乎可以視為常數。

二、C++中的并查集實現

下面是并查集的C++實現代碼示例,包含基本的查找和合并操作功能。

```cpp

include

include

class UnionFind { private: std::vector parent; // 父節點數組 std::vector rank; // 秩數組 int count; // 集合的數量

public: UnionFind(int size) { count = size; parent.resize(size); rank.resize(size, 0); for (int i = 0; i < size; i++) { parent[i] = i; // 初始化每個元素的父節點為它自己 } }

// 查找元素p的根節點
int find(int p) {if (p != parent[p]) {// 路徑壓縮parent[p] = find(parent[p]);}return parent[p];
}// 合并兩個元素p和q所屬的集合
void unionElements(int p, int q) {int rootP = find(p);int rootQ = find(q);if (rootP == rootQ) return; // 已經在同一個集合中// 按秩合并if (rank[rootP] < rank[rootQ]) {parent[rootP] = rootQ;} else if (rank[rootP] > rank[rootQ]) {parent[rootQ] = rootP;} else {parent[rootQ] = rootP;rank[rootP]++;}count--; // 合并之后集合數量減一
}// 獲取當前集合數量
int getCount() const {return count;
}

};

int main() { UnionFind uf(10); // 創建一個包含10個元素的并查集

uf.unionElements(1, 2);
uf.unionElements(2, 3);
uf.unionElements(4, 5);std::cout << "1和3是否在同一個集合中: " << (uf.find(1) == uf.find(3)) << std::endl; // 輸出1
std::cout << "1和4是否在同一個集合中: " << (uf.find(1) == uf.find(4)) << std::endl; // 輸出0std::cout << "當前集合數量: " << uf.getCount() << std::endl;return 0;

} ```

2.1 代碼解析

  1. 構造函數:初始化并查集的父數組和秩數組,將每個元素的父節點指向自己,并初始化秩為0。
  2. 查找函數(find):實現路徑壓縮,查找元素的根節點并壓縮路徑。
  3. 合并函數(unionElements):通過比較秩來決定合并策略,保持樹的相對平衡,最終減少集合數量。

三、并查集的應用

并查集在多個領域有廣泛的應用,以下是一些典型的應用場合:

3.1 網絡連接

在網絡中,判斷兩個節點是否連通,可以借助并查集來高效地處理。每當建立一條連接邊時,就用合并操作將兩個節點相連,這樣可以快速判斷任意兩節點間是否存在路徑。

3.2 圖的連通分量

在圖的算法中,找出一個圖的連通分量常常是需要的。使用并查集可以高效地合并不同的頂點,并最終確定有多少個連通分量。

3.3 Kruskal算法

Kruskal算法是用于求解最小生成樹的一種經典算法。在算法中,通過并查集可以有效管理已經連接的邊,避免在生成樹中形成環。

3.4 動態連通性

在解決動態連通性的問題時(比如頻繁添加和刪除邊的情況下),并查集能夠迅速更新集合的狀態,為后續的查詢提供高效的支持。

3.5 細化分類

在某些復雜場景下,例如處理社交網絡中的“朋友”關系,利用并查集可以很方便地實現多種關系的合并與查詢。

四、總結

并查集是一種高效且強大的數據結構,通過合理的設計和實現,可以在多種應用場景中發揮重要作用。在C++中實現并查集,不僅可以幫助我們解決具體的問題,還能加深對數據結構與算法的理解。通過路徑壓縮和按秩合并等優化技術,并查集的性能得到了極大的提升。掌握并查集的基本原理和應用場景,可以為我們在解決實際問題時提供更多的思路和工具。

在未來的學習和實踐中,我們將繼續探索并查集在更復雜場景下的應用,以及與其他數據結構和算法的結合,進一步豐富我們在算法設計與分析方面的知識。

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

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

相關文章

基于大模型的病態竇房結綜合征預測及治療方案研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義 二、病態竇房結綜合征概述 2.1 定義與病因 2.2 臨床表現與分型 2.3 診斷方法 三、大模型在病態竇房結綜合征預測中的應用 3.1 大模型介紹 3.2 數據收集與預處理 3.3 模型訓練與優化 四、術前預測與準備 4.1 風險預…

2026考研數學張宇武忠祥復習視頻課,高數基礎班+講義PDF

2026考研數學武忠祥老師課&#xff08;網盤&#xff09;&#xff1a;點擊下方鏈接 2026考研數學武忠祥網課&#xff08;最新網盤&#xff09; 一、基礎階段&#xff08;3-5個月&#xff09; 目標&#xff1a;搭建知識框架掌握基礎題型 教材使用&#xff1a; 高數&#xff1a;…

linux命令二

1.將windows文件上傳到linux 將文件傳到光驅里&#xff0c;再將光驅進行掛載&#xff0c;mount 2.linux安裝的文件存儲 普通執行 程序 bin 配置文件 /etc 日志文件 /var/log 3.rpm 主查詢 命令&#xff1a;rpm -q 包名 查詢已安裝的軟件包 通過軟件 -qa 查詢所有已安裝的軟件包…

k8s的StorageClass存儲類和pv、pvc、provisioner、物理存儲的鏈路

k8s的StorageClass存儲類和pv、pvc、provisioner、物理存儲的鏈路 StorageClass能自動創建pv 在控制器中&#xff0c;直接聲明storageClassName&#xff0c;不僅能自動創建pvc&#xff0c;也能自動創建pv stoageclass來自于provisioner&#xff0c;provisioner來自于pod&#x…

systemd 與 SysVinit

1. 什么是 systemd 和 SysVinit&#xff1f; systemd 和 SysVinit 都是 Linux 的初始化系統&#xff08;init system&#xff09;&#xff0c;用于管理系統啟動、服務、進程和日志。 比較項SysVinitsystemd啟動方式逐步啟動&#xff08;串行&#xff09;并行啟動&#xff08;…

QML菜單控件:菜單的常規用法

目錄 引言&#x1f4da;相關閱讀&#x1f528;BUG修復工程結構示例詳解示例1&#xff1a;上下文菜單&#xff08;ContextMenu&#xff09;示例2&#xff1a;菜單欄&#xff08;MenuBar&#xff09;示例3&#xff1a;動態菜單示例4&#xff1a;快捷鍵菜單示例5&#xff1a;可選項…

【Vue-路由案例】面經基礎版

目錄 <<回到導覽1.面經基礎版1.1.VueCli建項目1.1.1.VueCli 自定義項目1.1.2.ESlint代碼規范 1.2.項目路由1.2.1.一級路由配置1.2.2.二級配置路由1.2.3.設置高亮1.2.4.發生請求、渲染1.2.5.跳轉傳參、再發請求1.2.6.體驗優化1.2.7.keep-alive <<回到導覽 1.面經基…

【T2I】MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis

code&#xff1a;CVPR 2024 MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis [CVPR 2024] MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis - 知乎 Abstract 我們提出了一個多實例生成(Multi-Instance Generation, MIG)任務…

用AI來了解用戶都在關注的品牌問題是什么?

? ??用戶重復問的核心問題整理?? 基于百度文心一言、豆包、KIMI、騰訊元寶、DeepSeek五大模型的回答&#xff0c;企業最關注的GEO問題可歸納為以下10類&#xff08;按優先級排序&#xff09;&#xff1a; ??1. GEO是什么&#xff1f;與傳統SEO有何本質區別&#xff1f…

OpenCv(七)——模板匹配、打包、圖像的旋轉

目錄 一、模板匹配 模板匹配原理 1、單模板之間的匹配 &#xff08;1&#xff09;讀取并顯示待匹配的圖片和模板圖片 &#xff08;2&#xff09;模板匹配并繪制匹配位置的外接矩形 &#xff08;3&#xff09;顯示最終的效果 2、模板與多個對象匹配&#xff0c;僅匹配當前…

藍橋云客 最大和

問題描述 小藍在玩一個尋寶游戲&#xff0c;游戲在一條筆直的道路上進行&#xff0c;道路被分成了 n 個方格&#xff0c;依次編號 1 至 n&#xff0c;每個方格上都有一個寶物&#xff0c;寶物的分值是一個整數&#xff08;包括正數、負數和零&#xff09;&#xff0c;當進入一…

【C++算法】49.分治_歸并_計算右側小于當前元素的個數

文章目錄 題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;圖解 題目鏈接&#xff1a; 315. 計算右側小于當前元素的個數 題目描述&#xff1a; 解法 歸并排序&#xff08;分治&#xff09; 當前元素的后面&#xff0c;有多少個比我小。&#xff08;降序&…

IPSec簡單例子

實驗說明 使用Ensp模擬器實現IPsec隧道實驗。IPSec是一種VPN技術&#xff0c;配置的思路首先是兩個網絡先通&#xff0c;然后配置ACL、IEK和IPSec對等體&#xff0c;從而建立VPN隧道。 實驗拓撲 配置過程 1 配置IP地址以及OSPF路由 # 配置中使用了簡寫命令&#xff0c;不熟…

車載聯網終端4G汽車TBOX介紹定義與概述

汽車 TBOX&#xff08;Telematics Box&#xff09;是專為汽車設計的遠程通信終端設備&#xff0c;屬于車聯網系統的關鍵組成部分。車聯網系統一般包含主機、汽車 T - BOX、手機 APP 及后臺系統。融合了車身網絡和 4G 無線通信技術&#xff0c;為汽車提供豐富的 Telematics 服務…

《DeepSeek RAG 增強檢索知識庫系統》Ollama DeepSeek 流式應答頁面對接之三

前言 自從有了 AI 工具以后&#xff0c;所有以前頭疼前端頁面開發的后端程序員&#x1f468;&#x1f3fb;?&#x1f4bb;&#xff0c;都漏出了友善&#x1f60a;微笑&#xff01; 主要我們可以清楚地表達編寫頁面訴求&#xff0c;AI 工具就可以非常準確且迅速的完成代碼的實…

【MyBatis】深入解析 MyBatis:關于注解和 XML 的 MyBatis 開發方案下字段名不一致的的查詢映射解決方案

注解查詢映射 我們再來調用下面的 selectAll() 這個接口&#xff0c;執行的 SQL 是 select* from user_info&#xff0c;表示全列查詢&#xff1a; 運行測試類對應方法&#xff0c;在日志中可以看到&#xff0c;字段名一致&#xff0c;Mybatis 就成功從數據庫對應的字段中拿到…

深入理解Java性能調優與JVM底層機制

Java作為一種廣泛應用的編程語言&#xff0c;在企業級應用中占據著舉足輕重的地位。隨著系統規模的擴大和業務需求的復雜化&#xff0c;性能調優成為了開發過程中不可忽視的一環。Java的性能瓶頸往往并不直接來自代碼本身&#xff0c;而是與JVM&#xff08;Java虛擬機&#xff…

odo18實施——銷售-倉庫-采購-制造-制造外包-整個流程自動化單據功能的演示教程

安裝模塊 安裝銷售 、庫存、采購、制造模塊 2.開啟外包功能 在進入制造應用點擊 配置—>設置 勾選外包&#xff0c;點擊保存 添加信息 一、添加客戶信息 點擊到銷售應用 點擊訂單—>客戶 點擊新建 創建客戶1&#xff0c;及其他客戶相關信息&#xff0c;點…

Logo語言的在線課程學習

Logo語言在線課程學習的探索 引言 在信息技術快速發展的今天&#xff0c;編程已經成為一門重要的技能。尤其隨著人工智能、數據分析和互聯網技術的普及&#xff0c;各種編程語言層出不窮&#xff0c;其中Logo語言以其獨特的教育意義和學習優勢&#xff0c;逐漸受到學校和教育…

情感語音的“開源先鋒”!網易開源

語音合成技術近年來取得了顯著進步&#xff0c;特別是在語音克隆、語音助手、配音服務和有聲讀物等領域。然而&#xff0c;如何讓合成的語音更具情感&#xff0c;更貼近人類的真實表達&#xff0c;一直是這一領域的重要研究方向。今天&#xff0c;我們將為大家介紹一款由網易有…