数据结构之不相交集类
生活随笔
收集整理的這篇文章主要介紹了
数据结构之不相交集类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 不相交集類是解決等價關系問題的一種非常有效的手段!等價關系是一種關系R,他滿足自反性,對稱性與傳遞性。有人說散列是最藝術的數據結構,優先隊列是最優雅的數據結構
而不相交集類就是最簡潔的數據結構!這些說法我非常贊同,因為不相交集類的實現代碼真的太簡潔了。
? ? 處理等價關系最重要的問題就是要判斷任意兩個元素a,b是等價的,根據離散數學的知識,一個等價關系就決定了一個劃分,所以我們要判斷a,b是否屬于同一個劃分,而每個劃分都會有一個代表元,所以我們只需要判斷a,b,是否屬于同一個代表元就行了!
? ?而不相交集類就實現了這個功能,首先他提供了union操作,如union(a,b)表示a,b是等價的,一般可以讓b記住a,不過更有效的辦法是按高度求并,即如果a高的話就讓b記住a,否則就讓a記住b。這里的“記住”其實就是一個指向,這種幾何結構與樹的結構剛好反過來了。他是由子節點指向父節點。
? 還有就是find操作,其實就是找代表元,最容易想到的就是找到根節點就行了,不過我們不止這樣,我們在找根節點的時候還對路徑高度進行了壓縮!從我的代碼你就會發現僅僅一句代碼就實現了這種聽起來很麻煩的事,所以說這是一種特別簡潔的數據結構!
?下面就是我的代碼:
//Disjsets.h
#ifndef DISJSETS_H #define DISJSETS_H #include<iostream> #include<vector> using namespace std; class Disjsets { private:vector<int>s; public:Disjsets(int num):s(num){for(int i=0;i<s.size();i++)s[i]=-1;}int find(int x) //路徑壓縮查找{if(s[x]<0)return x;elsereturn s[x]=find(s[x]);}void(unionSets)(int root1,int root2) //按高度求并{if(s[root1]<s[root2])s[root1]=root2;else{if(s[root1]==s[root2])s[root1]--;s[root2]=root1;}} }; #endif // DISJSETS_H
? ?還有值得一提的是這種結構的實際應用也非常廣泛,比如設計迷宮就能用上,不過我認為最能體現其價值的是在圖論,在判斷一個圖是否連通時這種結構就能大展身手,不過這里就不展開講了!
總結
以上是生活随笔為你收集整理的数据结构之不相交集类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《PUBG》大动作封锁3百万玩家 作弊问
- 下一篇: 《计算机教育》专题报道:培养兴趣,渔之以