【Python數據結構】——并查集的實現(查找、合并、集合、實例)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/7/30 23:12
# @Author  : @linlianqin
# @Site    : 
# @File    : 并查集專題(合并、查找、集合).py
# @Software: PyCharm
# @description:'''
并查集其實就是多個數組,每一個數組都是一顆樹,然后并查集相當于是一個森林
基本操作:
合并(union)
查找(find)
集合(set)
'''# 初始化:給定一系列升序連續的編號,將編號初始化為并查集,形成一個森林,每個元素的父親結點(根節點)都是自己
def UFS_init(n):father = [i for i in range(n)]root = [i for i in range(n)]return father,root# 查找:在已經有的并查集中查找給定的元素的根節點——即通過self,father來進行查找根節點
def UFS_findroot(element,n,father):# 找到根節點時,返回根節點if element == father[element]:return element# 沒有找到則繼續查找return UFS_findroot(father[element],n,father)# 進行路徑壓縮
def UFS_ZIP(element,father,root):# 臨時保存當前元素temp = element# 查找element的根節點while element != father[element]:element = father[element]# 將路徑壓縮while temp != father[temp]:root[temp] = elementtemp = father[temp]return element# 查找:在已經有的并查集中查找給定的元素的根節點——路徑壓縮,即通過self.root來進行查找根節點,時間復雜度為O(1)
def UFS_findrootzip(element,root):return root[element]# 合并:
## 當兩個元素不在同一個集合的時候合并兩個集合,即將其中一個集合的根節點指向另一個集合的根節點即可合并
## 當兩個元素在同一個集合的時候不進行操作
def UFS_union(x,y,n,father,root):### 判斷兩個元素是否在同一個集合的方法是判斷兩個元素的根節點是否為同一個,是則在同一個集合,否則不是rootx = UFS_findroot(x,n,father)rooty = UFS_findroot(y,n,father)if rootx != rooty:root[rooty] = rootx # 將x的根節點設置為yfather[rooty] = rootx # 將x的父節點設置為yreturn root,father# 假設有編號0-10的同學
# 其中兩個人為一組,一個人可以出現在多個二人組合中,問可以分為幾個大組
# 輸入:人數n(用于創建一定空間的父節點數組和根節點數組),組別m(用于合并同一組的人)
# 如輸入:
# n = 11 , m = 6
# groups = [[0,1,2],[2,3,4],[4,6],[5,7],[8,9],[9,10]]
# 輸出:
# group_num = 3 _____ 【0,1,2,3,4,6】【8,9,10】def main(m,n,groups):# 大組的個數其實就是并查集中不同根節點的個數isroot = [0 for _ in range(n)]# 初始化并查集father,root = UFS_init(n)print("初始化:")print("father:",father)print("root:",root)# 遍歷組別,合并同一組別的兩個集合for group in groups:for index in range(len(group)-1):UFS_union(group[index],group[index+1],n,father,root)print("合并后:")print("father:",father)print("root:",root)# 遍歷self.root,查看有多少個不同的集合個數for i in range(n):isroot[root[i]] = 1print("isroot:", isroot)num_group = sum(isroot)return num_groupn = 11
m = 6
groups = [[0,1,2],[2,3,4],[4,5,6],[5,7],[8,9],[9,10]]
print(main(m,n,groups))## 其他
# todo:統計每個集合的元素個數——將isroot[root[i]] = 1改為isroot[root[i]] += 1
# todo:答應出合并集合后的最終狀態——遍歷所有元素,res = [[] for _ in range(n],將元素對應添加到根節點作為索引的對應小列表中即可

運行結果:

初始化:
father: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
root: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
合并后:
father: [0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8]
root: [0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8]
isroot: [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
2

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

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

相關文章

如何實現ABB機器人與老式焊機的連接控制

問題: 請教一個機器人與老式焊機如何連接,如何設置。 我現在是用SET指令設DO為1再外接繼電器來控制焊機工作的,用RESET指令來使焊機停止工作的。現在可 以焊接,但是如果中間停止或機器人報錯停止不動,焊機始終處于工作…

gitlab 雜記

GitLab 編譯部署 1,請盡量不要在國內主機上部署,中途天朝很有可能導致gem執行出現問題,以下在AWS上部署; 2,系統中必須要有swap分區,不然會出現500錯誤; 系統版本:CentOS 6.x x86_6…

Hadoop分布式系統的安裝部署

1、關于虛擬機的復制 新建一臺虛擬機,系統為CentOS7,再克隆兩臺,組成一個三臺機器的小集群。正常情況下一般需要五臺機器(一個Name節點,一個SecondName節點,三個Data節點。) 此外,為…

Windows線程調度學習(一)

前言 Windows 線程調度器的實現分散在內核各處,并且與許多組件都有關聯,很難進行系統地學習,所以我打算寫幾篇文章來記錄下自己學習過程中的思考和分析,同時也方便日后查閱,此文可以看作是《Windows內核原理與實現》中…

機器人的有效負荷

問題: 假如我想在程序里做多幾個有效載荷,但在手動操縱畫面上只能加一個,其它要怎樣用?給個實際例子給我啊. 回答: 在搬運中,確實是有載荷發生變化的情況,如兩抓(A B)的夾具,有三種載荷情況,1、A抓有載荷…

【Python生成readme文件】——Markdown語法

鏈接:https://www.cnblogs.com/wj-1314/p/8547763.html

編程之美2.13子數組的最大乘積

題目: 給定一個長度為N的數組,只許用乘法,不許用除法,計算任意(N-1)個數的組合中乘積最大的一個組,并寫出算法的時間復雜度。 如果把所可能的乘積找出來,共有(N-1&#x…

[SceneKit專題]11-Reference-Nodes引用節點

說明 本系列文章是對<3D Apple Games by Tutorials>一書的學習記錄和體會 此書對應的代碼地址 SceneKit系列文章目錄 本文將完成一個完整的node節點,帶有完整貼圖,并將其導入其他場景中,成為其中的一個引用節點.這樣可以更方便的組織場景,并能復用場景中的節點,正類似于面…

scapy 安裝及簡單測試

關于scapy Scapy的是一個強大的交互式數據包處理程序&#xff08;使用python編寫&#xff09;。它能夠偽造或者解碼大量的網絡協議數據包&#xff0c;能夠發送、捕捉、匹配請求和回復包等等。它可以很容易地處理一些典型操作&#xff0c;比如端口掃描&#xff0c;tracerouting&…

MoveAbsJ在使用時和MOVEJ有什么區別

問 題&#xff1a; MoveAbsJ在使用時和MOVEJ有什么區別 回 答&#xff1a; MoveAbsJ的目標點是用六個軸伺服電機的偏轉角度值來指定的。 MOVEJ和MOVEL的目標點是用坐標系X Y Z的值來指定的。

Python中的序列操作

Python中的序列操作 分類: python undefined 官方手冊&#xff1a;https://docs.python.org/3.7/library/stdtypes.html#sequence-types-list-tuple-range 序列簡介 序列是指按照位置順序來存儲數據的數據結構&#xff0c;也就是說能通過數值索引進行操作。實際上&#x…

automaticallyAdjustsScrollViewInsets的作用

簡單點說就是automaticallyAdjustsScrollViewInsets根據按所在界面的status bar&#xff0c;navigationbar&#xff0c;與tabbar的高度&#xff0c;自動調整scrollview的 inset,設置為no&#xff0c;不讓viewController調整&#xff0c;我們自己修改布局即可~轉載于:https://ww…

JavaScript 基礎知識 - BOM篇

前言 本篇文章是JavaScript基礎知識的BOM篇&#xff0c;如果前面的《JavaScript基礎知識-DOM篇》看完了&#xff0c;現在就可以學習BOM了。 注意&#xff1a; 所有的案例都在這里鏈接: 提取密碼密碼: yvxo&#xff0c;文章中的每個案例后面都有對應的序號。 1. BOM 基本概念 B…

全球首例機器人自殺事件 因受夠無聊家務

據鳳凰網,一個奧地利家庭購買一小機器人,每天工作就是倒垃圾、倒垃圾。一天完工后,它竟自己啟動,爬到爐邊&#xff0c;推開上面的鍋&#xff0c;把自己活活燒死…專家稱這個機器人實在受夠了無聊的家務瑣事&#xff0c;才毅然選擇自殺機器人也是有尊嚴的!為這有骨氣的robot點根…

【python基礎】——數據類型(列表、字典、集合)

駿馬金龍——python語法基礎 python基礎 變量與運算 符號//%**意義整除整除取余冪次方數據種類 #mermaid-svg-7nSRRijcYFCYwTDr .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-7nSRRijcYFCYw…

linux命令:mkdir命令

命令參數&#xff1a; -m, --mode模式&#xff0c;設定權限<模式> (類似 chmod)&#xff0c;而不是 rwxrwxrwx 減 umask -p, --parents 可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在,加上此選項后,系統將自動建立好那些尚不存在的目錄,即一次可以建立多個目錄; …

js設置奇偶行數樣式

$(document).ready(function () {odd { "background": "none" }; //奇數樣式 even { "background": "#f3f3f3" }; //偶數樣式 odd_even(".gys_xq", odd, even);});function odd_even(id, odd, even) {$(id).find("…

貝塞爾曲線切割圓角

ios 系統框架已經給我們提供了相應的切割圓角的方法, 但是如果在一個見面有很多控件切割的話會出現卡頓和個別不切的現象 ?123456789101112131415161718192021222324252627/* 創建一個Button */UIButton * button [UIButton buttonWithType:(UIButtonTypeSystem)];[button se…

機器人實現屠宰自動化

當 WESTFLEISCH 注冊合作社考慮在 Coesfeld 肉類加工中心內自動化原有的人工屠宰設備過程時&#xff0c;首先在“剔除直腸”及“切開盆腔骨及腹部”兩個流程中測試使用了兩臺庫卡機器人。在此過程中&#xff0c;機器人主要以它工作的質量及經濟效益說服了使用者。 實施措施/解…

DOM編程藝術12章

在submit.html中&#xff0c;代碼簡略成如下也行 <article><h1>Thanks!</h1><p>Thanks for contacting us. Well get back to you as soon as we can.</p></article> </body> </html> 說明了只是插入article的部分&#xff0c…