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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【数据结构】集合及运算

發布時間:2024/4/11 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构】集合及运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

集合的表示

集合運算:交、并、補、差,判定一個元素是否屬于某一集合
并查集:集合并、查某元素屬于什么集合

并查集問題中集合存儲如何實現?

可以用樹結構表示集合,樹的每個結點代表一個集合元素

采用數組存儲形式

集合運算

(1)查找某個元素所在的集合(用根結點表示)

int Find( SetType S[ ], ElementType X ) { /* 在數組S中查找值為X的元素所屬的集合 *//* MaxSize是全局變量,為數組S的最大長度 */int i;for ( i=0; i < MaxSize && S[i].Data != X; i++) ;if( i >= MaxSize ) return -1; /* 未找到X,返回-1 */for( ; S[i].Parent >= 0; i = S[i].Parent ) ;return i; /* 找到X所屬集合,返回樹根結點在數組S中的下標 */ }

(2)集合的并運算

分別找到X1和X2兩個元素所在集合樹的根結點
如果它們不同根,則將其中一個根結點的父結點指針設置成另一個根結點的數組下標。

void Union( SetType S[ ], ElementType X1, ElementType X2 ) {int Root1, Root2;Root1 = Find(S, X1);Root2 = Find(S, X2);if( Root1 != Root2 )S[Root2].Parent = Root1; }

為了改善合并以后的查找性能,可以采用小的集合合并到相對大的集合中。(修改Union函數)

#define MAXN 1000 /* 集合最大元素個數 */ typedef int ElementType; /* 默認元素可以用非負整數表示 */ typedef int SetName; /* 默認用根結點的下標作為集合名稱 */ typedef ElementType SetType[MAXN]; /* 假設集合元素下標從0開始 */void Union( SetType S, SetName Root1, SetName Root2 ) { /* 這里默認Root1和Root2是不同集合的根結點 *//* 保證小集合并入大集合 */if ( S[Root2] < S[Root1] ) { /* 如果集合2比較大 */S[Root2] += S[Root1]; /* 集合1并入集合2 */S[Root1] = Root2;}else { /* 如果集合1比較大 */S[Root1] += S[Root2]; /* 集合2并入集合1 */S[Root2] = Root1;} }SetName Find( SetType S, ElementType X ) { /* 默認集合元素全部初始化為-1 */if ( S[X] < 0 ) /* 找到集合的根 */return X;elsereturn S[X] = Find( S, S[X] ); /* 路徑壓縮 */ } 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的【数据结构】集合及运算的全部內容,希望文章能夠幫你解決所遇到的問題。

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