25.4.30數據結構|并查集 路徑壓縮

書接上回

上一節:數據結構|并查集

前言

(一)理論理解:

1、在QuickUnion快速合并的過程中,每次都要找根ID,而路徑壓縮讓找根ID變得更加迅速直接。

2、路徑壓縮?針對的是findRootIndex()【查找根ID】進行的壓縮。

3、需要實現的是:

在找根節點的過程中,記錄這條路徑上的所有信息,處理完事務后,恢復保存的節點信息,恢復父節點的關系

(二)使用宏定義

(沒搞明白vscode怎么才能用下邊的宏代換)

#ifndef#else#endif 是 C、C++ 等編程語言中的預處理指令,主要用于條件編譯。

  • #ifndef:這是 "if not defined" 的縮寫,其作用是檢查某個宏是否未被定義。要是該宏未定義,就會執行 #ifndef 和 #else(若存在)或者 #endif 之間的代碼;反之,則跳過這些代碼。
  • #else:當 #ifndef 條件不滿足時,也就是宏已經被定義,就會執行 #else 和 #endif 之間的代碼。
  • #endif:用于標志條件編譯塊的結束,和 #ifndef 配對使用。

一、路徑壓縮?--鏈棧

(一)理解:

? ? ? ? ? ? 鏈棧(只需要維護棧頂指針),而鏈式隊列(需要維護隊頭隊尾),所以用鏈棧更好

對查找根ID函數進行操作:對于每一個節點,把他的索引放到棧里,記錄了先后順序

? ? ? ? ? ??

(二)代碼:


/**************使用鏈棧實現路徑壓縮*******************///定義鏈棧結構
typedef struct setNode{int index;struct setNode*next ;
}setNode;
//入棧
static setNode *push(setNode *stack, int index){setNode *node = malloc(sizeof(setNode));node->index = index;node->next = stack;return node;
}
//出棧
static setNode *pop(setNode *stack, int *index){setNode *tmp = stack->next;*index = stack->index;stack=stack->next;free(tmp);return stack;  
}//找元素a的根ID
static int findrootindex(const QuickUnionSet * setQU,Element a){int curIndex = findIndex(setQU,a);if(curIndex == -1){return -1;}//棧頂指針setNode*path=NULL;//找根ID,(節點的父節點指向自己時找到根結點)等價于quickfind中的groupidwhile(setQU->parentID[curIndex] !=curIndex){path = push(path, curIndex);//入棧,傳入棧頂指針,記錄索引,指針移動curIndex = setQU->parentID[curIndex];}//找到了根ID,恢復記錄的信息,把這些節點的父節點關系進行更新while(path){int pos;path = pop(path,&pos);setQU->parentID[pos] = curIndex;}return curIndex;
}

?(三)圖解

因為有點繞,不太理解最后畫了一下圖,模擬了一遍,理解了

梳理代碼時候寫的:

題目:如下圖示并查集,查找2的根結點

并查集的存儲如下:

從2開始入棧,岀棧過程中,使節點點的父ID直接為根ID,即可實現路徑壓縮,一步即可找到根。

終于理解咯~~

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

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

相關文章

C++-Lambda表達式

目錄 1.什么是 Lambda? 2.例子:打印每個元素(和 for_each 一起用) 3.捕獲外部變量(Capture) 3.1. 捕獲值(拷貝):[] 3.2. 捕獲引用:[&] 3.3. 指定捕…

每日一題洛谷P8635 [藍橋杯 2016 省 AB] 四平方和c++

P8635 [藍橋杯 2016 省 AB] 四平方和 - 洛谷 (luogu.com.cn) 直接暴力枚舉,不做任何優化的話最后會TLE一個,稍微優化一下就過了(數據給的還是太良心了) 優化:每層循環用if判斷一下,如果大于n就直接跳 當然…

羅技K580藍牙鍵盤連接mac pro

羅技K580藍牙鍵盤,滿足了我們的使用需求。最棒的是,它能夠同時連接兩個設備,通過按F11和F12鍵進行切換,簡直不要太方便! 連接電腦 💻 USB連接 1、打開鍵盤:雙手按住凹槽兩邊向前推&#xff0…

C語言與指針3——基本數據類型

誤區補充 char 的 表示范圍0-127 signed char 127 unsigned char 0-255enum不常用,但是常見,這里記錄一下。 enum Day {Monday 1,//范圍是IntTuesday 2,Wednesday 3 }; enum Day d Monday; switch (d) {case Monday:{printf("%d",Monday);…

如何理解 MCP 和 A2A 的區別?|AI系統架構科普

你有沒有發現,現在越來越多AI項目的架構圖里,都開始出現一些看不懂的新縮寫。 MCP(Multi-component Pipeline),還有另一個也經常出現在大模型系統搭建中的詞,叫 A2A(Agent-to-Agent)。 這倆東西看起來都跟智能體(Agent)有關,但到底有啥區別?誰更強?誰更適合你?…

C語言中 typedef 關鍵字

在C語言中,typedef 關鍵字用于為現有數據類型定義新的別名(類型重命名),其核心目的是?提高代碼可讀性?和?簡化復雜類型的聲明?。以下是其用法詳解及典型場景: 1.基本語法? typedef original_type new_type_name…

Learning vtkjs之TubeFilter

過濾器 沿著線生成管道 介紹 vtkTubeFilter - 一個在每條輸入線周圍生成管的過濾器 vtkTubeFilter是一個在每條輸入線周圍生成管的過濾器。管由三角形條帶組成,并隨著線法線的旋轉而旋轉。如果沒有法線存在,它們會自動計算。管的半徑可以根據標量或向…

python常用科學計算庫及使用示例

?一、NumPy - 數值計算基礎庫?? ??安裝?? pip install numpy ??核心功能示例?? 1. 數組創建與運算 import numpy as np# 創建數組 arr np.array([1, 2, 3, 4]) matrix np.array([[1, 2], [3, 4]])# 數學運算 print(arr 1) # [2 3 4 5] print(matrix …

中科院黃飛敏等人證明希爾伯特第六問題使用的或然判斷(估計)-沒有使用演繹推理的必然判斷

國家自然科學基金委在2013年介紹黃飛敏的工作,居然是錯誤的:黃飛敏等人73頁的論文,全篇都是用或然判斷的“估計”代替必然判斷的演繹證明,將沒有實驗的推演當成事實。 首頁 >>年度報告 >>2013年度報告 >>第二部…

【安裝指南】Chat2DB-集成了AI功能的數據庫管理工具

一、Chat2DB 的介紹 Chat2DB 是一款開源的、AI 驅動的數據庫工具和 SQL 客戶端,提供現代化的圖形界面,支持 MySQL、Oracle、PostgreSQL、DB2、SQL Server、SQLite、H2、ClickHouse、BigQuery 等多種數據庫。它旨在簡化數據庫管理、SQL 查詢編寫、報表生…

vite項目tailwindcss4的使用

1、安裝taillandcss 前幾天接手了一個項目,看到別人用tailwindcss節省了很多css代碼的編寫,所以自己也想在公司項目中接入tailwindcss。 官網教程如下: Installing Tailwind CSS with Vite - Tailwind CSS 然而,我在vite中按…

第 13 屆藍橋杯 C++ 青少組省賽中 / 高級組 2022 年真題

一、選擇題 第 1 題 題目:已知char a; float b; double c;,執行語句c a b c;后變量c的類型是( )。 A. char B. float C. double D. int 正確答案:C 答案解析: 在 C 中,表達式運算會進行類型…

解決GoLand無法Debug的問題

文章目錄 解決GoLand無法Debug的問題問題描述解決方案方法一:安裝并替換Delve調試工具方法二:通過GoLand自動安裝方法三:配置自定義Delve路徑 驗證解決方案常見問題排查總結 解決GoLand無法Debug的問題 問題描述 在使用GoLand進行Go語言開發…

5.2刷題

P1064 [NOIP 2006 提高組] 金明的預算方案 背包&#xff0b;附屬品DP #include<bits/stdc.h> using namespace std; #define int long long int n, m, v, p, q; struct node{int id, v, s, f; }a[100]; int b[32010], dp[32010]; bool cmp(node a, node b){if(a.id b.…

輕舟系列FPGA加速卡:大模型分布式訓練中的高效協同者

在超大規模模型&#xff08;如千億級參數&#xff09;的分布式訓練中&#xff0c;計算、存儲與通信的協同優化是突破性能瓶頸的關鍵。綠算技術公司的輕舟系列FPGA加速卡憑借其低延遲、高能效和可編程特性&#xff0c;能夠成為分布式訓練架構中的異構加速節點。其在訓練集群中的…

序列數據(Sequential Data)??:按順序排列的動態信息載體

核心定義?? 序列數據是??按特定順序排列??的數據集合&#xff0c;其中元素的??位置或時間順序??蘊含關鍵信息。例如&#xff1a; ??時間序列??&#xff1a;股票價格、氣溫變化&#xff08;按時間戳排列&#xff09;。??文本??&#xff1a;句子中的詞語序列…

【單片機數碼管實現第一位開始走0~9,1s后第二位再開始亮】2022-5-2

緣由怎么讓單片機數碼管實現第一位開始走0~9,1s后第二位再開始亮? - 24小時必答區 #include "REG52.h" void sm7447(unsigned char mz, unsigned char w) {unsigned char Xd0;P2255;P2mz;P3w;while(Xd); } void main() {unsigned char jz0,zhi128;unsigned int Ys4…

InnoDB索引的原理

在鵝廠后端開發一面&#xff0c;我遇到了如題這樣一個比較寬泛的問題&#xff0c;當時可能只是背了相關概念&#xff0c;對于索引的了解不是很深刻。 最近&#xff0c;我花了很大的功夫去深入了解MySQL的索引。 下面是我的一些思考&#xff1a; 索引&#xff0c;對于InnoDB來說…

FormCalc 支持的編程語言和軟件

FormCalc 是一種專為 PDF 表單計算設計的腳本語言&#xff0c;主要應用于 Adobe 生態及 SAP 相關工具。以下是支持 FormCalc 的主要軟件和平臺&#xff1a; 1. Adobe LiveCycle Designer&#xff08;最佳支持&#xff09; 原生支持&#xff1a;FormCalc 是 LiveCycle Designe…

unity 為什么不切片 Sprite.rect 與Sprite.textureRect的值還不一樣

一。測試代碼&#xff1a; 二。發現Debug不一樣的原因 與解決方案&#xff1a; 下圖右邊所示&#xff1a; 網格類型默認為緊密 在 Unity 中&#xff0c;紋理導入時可能存在自動的偏移和裁剪設置。即便你沒有手動切片&#xff0c;Unity 可能會根據紋理的導入設置&#xff0c;對…