【圖論】并查集的學習和使用

目錄

并查集是什么?

舉個例子

組成

父親數組:

find函數:

union函數:

代碼實現:

fa[] 初始化code:

find code:

遞歸實現:

非遞歸實現:

union code :

畫圖模擬:

路徑壓縮:

路徑壓縮Code:


并查集是什么?

是一種樹形的數據結構,一般用來處理集合的合并,查詢操作。

舉個例子

告訴你1的父節點是2 2的父節點是3 4的父節點是5 6沒有父節點 那么可以畫出

三個集合,或者說是樹?。然后我們一般用并查集判斷:①有幾棵樹 也就是有幾個集合 ② 兩個點是否同屬于一個集合 ③一個點是不是屬于這棵樹?

組成

主要是通過一個父親數組和一個find函數、一個union函數實現的。

父親數組:

記錄一個節點的父結點 初始化為自己 也就是一開始自己就是自己的父結點 自己單獨屬于一個集合

find函數:

根據鄰接關系 找到一個結點的根結點 如果兩個結點的通過find函數尋找出來的結點相同 則同屬一個集合

union函數:

遍歷鄰接關系時 將兩個鄰接的結點父親數組更新的作用 具體來說 判斷若兩個結點通過find函數尋找出來的根節點不相同 也就是不屬于一個集合 則將一個集合并入另一個集合 通過把前一個結點的根節點 的父親數組 標記為第二個結點的根節點 則兩個集合就合并了

代碼實現:

fa[] 初始化code:

for(int i=0;i<n;++i)fa[i]=i;

find code:

遞歸實現:

int finds(int a){if(a!=fa[a]){fa[a]=finds(fa[a]);}return fa[a];
}

非遞歸實現:

int finds(int a){while(a!=fa[a]){a=fa[a];}return fa[a];
}

詳細解釋:一個結點 只有父結點是自己 也就是fa[]數組中是自己 才能稱為根節點 finds函數就是判斷一個結點是否為根結點?如果不是 就繼續向上finds他的父節點 看是不是根結點 直到找到根節點 返回 這個根節點可以稱之為一個集合的標志

union code :

void unions(int x,int y){int fx=finds(x);int fy=finds(y);if(fx!=fy){fa[fx]=fy;}
}

詳細解釋:unions函數是用于遍歷鄰接關系時 更新集合關系。傳入兩個結點 找到他們的根節點 也就是他們所屬集合的標志 判斷是否相同 也就是判斷是否從屬于一個集合 如果不屬于一個集合 則把第一個集合的根節點 的父親結點 更新為?第二個集合的根節點。也就是把第一個集合和第二個集合合并 并且根節點保留為第二個集合的根節點 。

畫圖模擬:

①我們要判斷兩個點是否屬于一個集合 只要用find函數即可?

②我們要判斷共有幾個集合 只要看fa數組中有幾個 i=fa[i]即可 因為fa[i]等于i 代表是集合里的根結點 一個集合只有一個根結點 所以根結點數即為集合數量

路徑壓縮:

可以觀察到 每次調用find函數都需要經歷一串長長的遞歸 這正是函數時間花費的地方 考慮優化的地方 我們可以直接把fa[i]數組標記為i結點所屬集合的根節點 也就是把整條路徑上的fa[i]數組都標記為根節點 按上面畫圖的例題來說 就是把fa[1] fa[3] fa[4] 全部標記為4 這樣調用find函數的時候就特別快,一步到位。要想完成這個操作 只要在find函數后加一步 每次find的時候 找到了根節點的值 保存 再用一個while循環向上查找 把整條路徑上的結點的fa[]值都更新為找到的根節點?

路徑壓縮Code:

int new_finds(int a){int aa=a;//保存一下查找的點 也就是路徑的底部if(a!=fa[a]){fa[a]=finds(fa[a]);//找到了根節點}while(aa!=fa[a]){//向上更新整條路徑int temp=fa[aa];//先存儲路徑的下一個點fa[aa]=fa[a];//路徑壓縮一個aa=temp;//再壓縮下一個點}return fa[a];
}

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

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

相關文章

Java使用FFmpegFrameGrabber進行視頻拆幀,結合Thumbnails壓縮圖片保存到文件夾

引入依賴 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

mysql與redis的日志策略

MySQL 和 Redis 在日志記錄方面采用了不同的策略&#xff0c;分別對應寫前日志&#xff08;Write-Ahead Logging, WAL&#xff09;和寫后日志&#xff08;Write-After Logging&#xff09;。以下是它們的詳細說明&#xff1a; 1. MySQL&#xff1a;寫前日志&#xff08;Write-A…

nacos安裝,服務注冊,服務發現,遠程調用3個方法

安裝 點版本下載頁面 服務注冊 每個微服務都配置nacos的地址&#xff0c;都要知道 服務發現 2個是知道了解 遠程調用基本實現 遠程調用方法2&#xff0c;負載均衡API測試 遠程調用方法3&#xff0c;注解 負載均衡的遠程調用&#xff0c; 總結 面試題

Ubuntu Qt: no service found for - “org.qt-project.qt.mediaplayer“

1、前言 在一次項目過程中&#xff0c;因項目需求&#xff0c;需要將windows開發的Qt項目遷移到ubuntu系統中&#xff0c;且在某個功能項中需要播放音頻&#xff0c;在windows系統中能夠正常運行&#xff0c;但在ubuntu系統中卻顯示defaultServiceProvider::requestService(): …

Blender制作次表面材質

效果: 主要用沃羅諾伊紋理做出云絮感 然后EV開啟次表面設置

用 pytorch 從零開始創建大語言模型(四):從零開始實現一個用于生成文本的GPT模型

從零開始創建大語言模型&#xff08;Python/pytorch &#xff09;&#xff08;四&#xff09;&#xff1a;從零開始實現一個用于生成文本的GPT模型 4 從零開始實現一個用于生成文本的GPT模型4.1 編寫 L L M LLM LLM架構4.2 使用層歸一化對激活值進行標準化4.3 使用GELU激活函數…

vmware tools灰化

Windows7 32位的某些版本&#xff0c;已經不被vmware支持。下面是解決方法&#xff1a; 安裝kb4474419補丁包&#xff1a;https://www.catalog.update.microsoft.com/Search.aspx?qKB4474419網絡共享。必須要虛擬機和主機可通信。此方法不錯&#xff0c;但是操作起來太麻煩。…

ubuntu高并發內核參數調優 - (壓測客戶端調優)

業務上要求集群提供10w并發&#xff0c;10w并發聽上去不是很難&#xff0c;但10w并發持續1小時呢 在業務上線之前還需要我們自己對業務進行壓測&#xff0c;俗稱benchmark。 壓測的服務器也是需要進行性能調優的&#xff0c;以下列出調優前后的參數對比&#xff0c;更直觀的分析…

html5制作2048游戲開發心得與技術分享

2048游戲開發心得與技術分享 這里寫目錄標題 2048游戲開發心得與技術分享項目概述技術架構1. 核心技術棧2. 項目結構 核心功能實現1. 數據結構設計2. 移動邏輯實現3. 觸摸支持 性能優化1. DOM操作優化2. 事件處理優化 開發心得1. 代碼組織2. 調試技巧3. 用戶體驗優化 項目亮點技…

dify+deepseek聯網搜索:免費開源搜索引擎Searxng使用(讓你的大模型也擁有聯網的功能)

docker安裝SearXng 項目地址:https://github.com/searxng/searxng-docker 第一步 git clone下來 git clone https://github.com/searxng/searxng-docker.git第二步 進入 searxng-docker目錄中修改docker-compose.yaml(直接復制粘貼) cd searxng-dockerdocker-compose.yaml …

docker的anythingllm和open-webui壓縮包分享(國內鏡像拉取,百度云壓縮包分享)

文章目錄 前言第一部分&#xff1a;鏡像獲取&#x1f680; 方式一&#xff1a;切換國內下載鏡像?1. 下載anythingllm? 2. 下載open-webui &#x1f680;方式二&#xff1a;下載我分享的百度云? anythingllm壓縮包百度云鏈接? open-webui壓縮包 第二部分&#xff1a;下載之后…

DeepSeek-R1深度解讀

deepseek提出了一種通過強化學習&#xff08;RL&#xff09;激勵大語言模型&#xff08;LLMs&#xff09;推理能力的方法&#xff0c;個人認為最讓人興奮的點是&#xff1a;通過RL發現了一個叫“Aha Moment”的現象&#xff0c;這個時刻發生在模型的中間版本中。在這個階段&…

從零實現B站視頻下載器:Python自動化實戰教程

一、項目背景與實現原理 1.1 B站視頻分發機制 Bilibili的視頻采用 音視頻分離技術,通過以下方式提升用戶體驗: 動態碼率適配(1080P/4K/HDR) 分段加載技術(基于M4S格式) 內容保護機制(防盜鏈/簽名驗證) 1.2 技術實現路線 graph TDA[模擬瀏覽器請求] --> B[獲取加密…

AJAX的理解和原理還有概念

你想問的可能是 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09; &#xff0c;它并不是一門新的編程語言&#xff0c;而是一種在無需重新加載整個網頁的情況下&#xff0c;能夠與服務器進行異步通信并更新部分網頁的技術。以下從基本概念、原理、優點、使用場景等…

封裝一個分割線組件

最終樣式 Vue2代碼 <template><div class"sep-line"><div class"sep-label"><span class"sep-box-text"><slot>{{ title }}</slot> <!-- 默認插槽內容&#xff0c;如果沒有傳遞內容則使用title -->&…

Redis基本命令手冊——五大類型

目錄 一&#xff1a;基本操作 二&#xff1a;字符串&#xff08;String&#xff09; 三&#xff1a;哈希&#xff08;Hash) 四&#xff1a;列表&#xff08;List&#xff09; 五&#xff1a;集合&#xff08;Set&#xff09; 六&#xff1a;有序集合&#xff08;Zset&…

【C++】動態規劃從入門到精通

一、動態規劃基礎概念詳解 什么是動態規劃 動態規劃&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一種通過將復雜問題分解為重疊子問題&#xff0c;并存儲子問題解以避免重復計算的優化算法。它適用于具有以下兩個關鍵性質的問題&#xff1a; 最優子結構&…

Qt動態設置樣式,實現樣式實時切換

文章目錄 概要插件實現界面 核心代碼設置樣式 擴展導入樣式導出樣式 概要 最近需要設計界面&#xff0c;但是使用Qt的Designer只能看到每個界面單獨的樣式&#xff0c;程序中有些事需要主界面調用進行組合的界面&#xff0c;因此需要寫一個插件Ui可以直接輸入樣式內容&#xf…

集成學習之隨機森林

目錄 一、集成學習的含義 二、集成學習的代表 三、集成學習的應用 1、分類問題集成。&#xff08;基學習器是分類模型&#xff09; 2、回歸問題集成。&#xff08;基學習器是回歸模型&#xff09; 3、特征選取集成。 四、Bagging之隨機森林 1、隨機森林是有多個決策樹&a…

矩陣期望 E 的含義:概率

矩陣期望 E 的含義:概率 期望的含義 在概率論和統計學中,數學期望(或均值,簡稱期望)是試驗中每次可能結果的概率乘以其結果的總和,是最基本的數學特征之一,它反映隨機變量平均取值的大小。用公式表示,如果離散型隨機變量 X X X 可能取值為 x i x_