高階數據結構------并查集

并查集

在一些應用問題中,需要將n個不同的元素劃分成一些不相交的集合。開始時,每個元素自成一個集合,然后按照一定的規律將歸于同一組的元素集合合并。在此過程中要反復用到查詢某一個元素歸屬于哪一個集合的運算。適合于描述這類問題的抽象數據結構類型成為并查集(UnionFindSet)。

比如:親戚關系,朋友敵人關系,食物鏈關系。

比如:給定10個人,5對關系,沒對關系描述兩個人,表示這兩個人是親戚,最后問你某兩個人之間是否是親戚關系。

再比如:給定10個人,5對關系,沒對關系描述兩個人,表示這兩個人之間的關系(朋友或者敵人),最后問你某兩個人之間的關系。

…………

上述問題就可以使用并查集這一數據結構來解決。

接下來實現并查集這一數據結構

以一個簡單的列子為例:

某公司今年校招全國總共招生10人,西安招4人,成都招3人,武漢招3人,10個人來自不

同的學校,起先互不相識,每個學生都是一個獨立的小團體,現給這些學生進行編號:{0, 1, 2, 3,

4, 5, 6, 7, 8, 9}; 給以下數組用來存儲該小集體,數組中的數字代表:該小集體中具有成員的個

數。(負號下文解釋)

畢業后,學生們要去公司上班,每個地方的學生自發組織成小分隊一起上路,于是:

西安學生小分隊s1={0,6,7,8},成都學生小分隊s2={1,4,9},武漢學生小分隊s3={2,3,5}就相互認識

了,10個人形成了三個小團體。假設右三個群主0,1,2擔任隊長,負責大家的出行。

一:初始化

起初時,我們可以創建一個數組,數組下標表示元素的編號,數組中的值全部初始化為-1,表示該元素最初子集單獨為一個集合(自己就是父親)。

二:Find操作

該操作的目的是判斷某個元素屬于哪個集合(找到該元素所屬集合的代表元素(通俗來說就是向上找跟操作))。

該操作可以通過循環來實現,不斷去找自己的父親,不斷向上走,知道最終的元素沒有父親(值為-1)為止。

三:Union操作

已知兩個元素之間存在關系要合并這兩個元素,本質是將這兩個元素所屬的集合進行合并,這很好理解,朋友的朋友還是朋友。因此要先進行找兩個元素所屬集合的根節點,最終將這兩個集合合并(一個集合的根節點認另一個集合的根節點為父親)

順便可以統計一下合并后集合共有多少元素(abs(_ufs[root1]))

四:ISsame操作

給定兩個元素,判斷這兩個元素是否屬于同一個集合。

只需要判斷這兩個集合的祖先是否相同就可以了。

五:SetCount操作

判斷當前一共有多少個集合(有多少個大家庭)

只需要遍歷一遍數組,判斷有多少值為-1就可以了。

并查集優化操作

一般來說并查集實現成上面的樣子已經可以了,但是當數據量比較龐大的時候,效率(性能)

就會有所下降,因此要考慮進行優化。

一:優化Union操作

在上面實現的并查集中,采用的方法是將下標大的元素向下標小的元素合并,極端情況下經過一系列合并后集合會成為一個鏈表結構(一條線),再進行Find操作時時間復雜度就會是O(n)。

因此,我們改變合并思路,我們每次進行合并操作時,都將元素數量少的集合向元素數量多的集合合并,這樣就可以很好的控制集合這一樹形結構的高度,性能就會有所提升。

二:路徑壓縮

并查集只是要在某一個集合中找出一個代表元素,并不在意找出哪一個,因此對于不是根的結點,

認誰為父親都是可以的,因此我們在Find操作的過程中就可以進行路徑壓縮,將所有遍歷到的結點

的父親都修改成root,這樣可以大大降低樹的高度,查找的時間復雜度近似為O(1),性能就會提升。

路徑壓縮也可以實現成遞歸的形式(代碼短,好寫),但是不太推薦,遞歸怕的就是層數太深,

如果數據量非常大的情況下遞歸很可能是不可行的。

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

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

相關文章

OWASP Top 10 是什么?

OWASP(Open Web Application Security Project,開放Web應用安全項目)是一個致力于提高軟件安全性的國際非營利組織。其發布的 ?OWASP Top 10? 是最具影響力的Web應用安全風險清單,每3-4年更新一次,幫助開發人員、安全…

如何在IIS上部署net系統(安裝iis參考上一篇)

1.對后端項目打包,我使用的時rider 2.打包前端 npm run build 3.在iis上部署 網站-添加網站 4.選擇之前打包的后端文件,設置端口 5.安裝對應net環境插件:主要是runtime和sdk插件以及dotnet-hosting-2.2.0-win,具體版本看自己項…

Docker可視化管理工具Portainer安裝部署

1、安裝Portainer 編寫docker compose文件,使用docker compose文件完成Portainer的安裝,首先需要在服務器上編寫的名為portainer.yaml的文件,內容如下: [rootserver ~]# cat portainer.yaml services: portainer: image:…

ai之RAG本地知識庫--基于OCR和文本解析器的新一代RAG引擎:RAGFlow 認識和源碼剖析

目錄標題 RAG本地知識庫問答——基于OCR和文本解析器的新一代RAG引擎:RAGFlow 認識和源碼剖析RAGflow 主要功能: 一、RAGflow 簡介1.1 允許用戶上傳并管理自己的文檔(文檔類型可以是任意類型)1.2 RAGFlow的4個特色1.2.1 AI 模型的智能文檔處理系統1.2.2 …

[面試] 手寫題-new

function mynew(Func, ...args) {// 1.創建一個空對象const obj {}// 2.新對象隱式原型指向構造函數的顯式原型obj.__proto__ Func.prototype// 3.將構建函數的this指向新對象let result Func.apply(obj, args)// 4.返回objreturn result instanceof Object ? result : obj…

設計模式精講 Day 20:狀態模式(State Pattern)

【設計模式精講 Day 20】狀態模式(State Pattern) 文章標簽 設計模式, 狀態模式, Java開發, 面向對象設計, 軟件架構, 設計模式實戰, Java應用開發 文章簡述 狀態模式是行為型設計模式中的重要一員,用于管理對象在不同狀態下的行為變化。在…

橋島隧大型工程 3D 可視化監測平臺

深中通道作為“橋、島、隧、水下互通”一體化跨海集群工程,其復雜結構帶來高強度監測難題。借助圖撲軟件 HT 實現深中通道的建設與運營的數字化升級,為交通基建行業邁向高效、智能的未來提供了有力支撐。 圖撲自主研發的 HT for Web 產品搭建深中通道-橋…

基于SpringBoot和Leaflet的區域沖突可視化系統(2025企業級實戰方案)

摘要 在全球地緣沖突與應急事件頻發的2025年,區域態勢可視化系統成為政府及企業的決策剛需。本文提出基于??SpringBoot 3.2??后端與??Leaflet 1.9.5??前端的沖突可視化解決方案,融合多源異構數據(衛星影像、輿情熱力、設施狀態&…

[密碼學實戰]國密TLCP協議報文解析代碼實現(三十)

[密碼學實戰]國密TLCP協議報文解析代碼實現(三十) 本文將深入解析國密TLCP協議報文結構,提供完整的Java實現代碼,幫助開發者理解TLCP協議在國密環境下的通信機制和安全性設計。 一、國密TLCP協議概述 TLCP(Transport Layer Cryptographic Protocol)是基于國密算法(SM2/…

[Python] -基礎篇5-玩轉Python內置數據結構:列表、元組、字典與集合

Python 是一門以簡潔優雅著稱的編程語言,其中內置的數據結構為日常編程提供了強大支持。本文將系統介紹 Python 中四大核心數據結構:列表(list)、元組(tuple)、字典(dict)與集合(set),并配以實用示例,幫助讀者全面掌握其用法及適用場景。 一、列表(List):可變序…

技術突破與落地應用:端到端 2.0 時代輔助駕駛TOP10 論文深度拆解系列【第八篇(排名不分先后)】

HiP-AD: Hierarchical and Multi-Granularity Planning with Deformable Attention for Autonomous Driving in a Single Decoder GitHub地址:?https://github.com/nullmax-vision/HiP-AD? 在自動駕駛技術飛速發展的今天,端到端自動駕駛(E…

transformer位置編碼研究相關的綜述、論文

一、權威綜述 《利用位置編碼實現長度外推》 (騰訊云開發者社區, 2024) 系統分析絕對/相對位置編碼(APE/RPE)在長序列外推中的技術演進,涵蓋RoPE、Alibi、Xpos等優化方案,討論位置插值、NTK-aware縮放等擴展…

垂直領域AI智能體開發指南:用Bright Data MCP接入智能體攻克數據難關

垂直領域AI智能體開發指南:用Bright Data MCP接入智能體攻克數據難關 一、智能體時代的數據困局1.1 AI智能體的爆發式增長1.2 開發者遭遇的"數據瓶頸" 二、Bright Data MCP:智能體的數據引擎2.1 重新定義數據獲取方式2.2 支持的核心場景2.3 四…

Stable Diffusion 項目實戰落地:從0到1 掌握ControlNet 第三篇: 打造光影字形的創意秘技-文字與自然共舞

上一篇,我們一起玩轉了 野外光影字,是不是被那種自然和光影交織的效果驚艷到啦? 如果你錯過了那篇文章,別擔心,趕緊點這里補課:Stable Diffusion 項目實戰落地:從0到1 掌握ControlNet:打造光影文字 第二篇 - 野外光影字。 今天,我們將一起做一個 生成的嵌入式文字【…

CppCon 2018 學習:Feather: A Modern C++ Web Development Framework

你這段內容羅列的是 Web 開發中的幾個基礎概念和組成模塊,下面我逐一用中文進行解釋,并理清它們之間的關系: 基礎概念說明 1. HTTP Server(HTTP服務器) 是一個監聽 HTTP 請求并返回響應的程序。主要功能&#xff1a…

武漢大學機器人學院啟航:一場顛覆性的產教融合實驗,如何重塑中國智造未來?

當百年學府按下“產業加速鍵”,教育革命的號角已經吹響 2025年7月,武漢大學一紙公告震動教育界與科技圈——成立機器人學院,攜手小米、宇樹等硬科技領軍企業,聘請10位產業教授入駐。這絕非一次常規的校企合作,而是一場…

QT記事本4——下拉框修改值后解決亂碼問題

下拉框修改值后解決亂碼問題 void Widget::onCurrentIndexChanged(int index) {qDebug()<<index;//索引從0開始qDebug()<<ui->comboBox->currentText();//切換編碼時&#xff0c;首先清空當前的文本框ui->textEdit->clear();if(file.isOpen()){//僅在…

““ ‘‘ C++

在C中&#xff0c;"" 和 的含義完全不同&#xff0c;只有""是空字符串&#xff0c;而既不是空字符串&#xff0c;也不能表示空字符&#xff0c;具體區別如下&#xff1a; 1. 雙引號 ""&#xff1a;空字符串字面量 類型&#xff1a;const char…

電腦遠程控制另一臺電腦無法連接怎么辦

電腦遠程控制另一臺電腦無法連接怎么辦&#xff1f;遠程桌面連接是遠程管理另一臺計算機時比較常用的方式&#xff0c;在進行電腦遠程控制時&#xff0c;無法連接是常見的問題&#xff0c;以下將從多個方面分析原因并提供解決方法。如果涉及無公網IP目標主機需要遠程桌面連接的…

springboot3.2/3.4+rocketmq5.3.3測試程序的基本例子

想測試下springboot新版中與rocketmq5.3.3的配置使用&#xff0c;今天嘗試了下&#xff0c;記錄如下&#xff1a; 1、首先springboot使用3.2.7&#xff0c;rocketmq使用5.3.3&#xff0c;且使用docker部署rocketmq。 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/do…