日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构之不相交集类

發布時間:2024/1/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之不相交集类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 不相交集類是解決等價關系問題的一種非常有效的手段!等價關系是一種關系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


? 真的是非常簡潔的代碼,而且這樣實現的效率也非常高,進行一系列union與find操作的時間幾乎是常數時間運行,這比起沒有按大小求并和沒有進行路徑壓縮的方法的O(n)效率來說是個了不起的飛躍!然而實現這種飛躍的代碼竟然就這么簡單。
? ?還有值得一提的是這種結構的實際應用也非常廣泛,比如設計迷宮就能用上,不過我認為最能體現其價值的是在圖論,在判斷一個圖是否連通時這種結構就能大展身手,不過這里就不展開講了!

總結

以上是生活随笔為你收集整理的数据结构之不相交集类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。