集合及運算

2022-02-22 19:58:28 字數 1259 閱讀 6122

目錄資料結構與演算法_python_c完整教程目錄:

更新、更全的《資料結構與演算法》的更新**,更有python、go、人工智慧教學等著你:

集合運算:交、並、補、差,判定乙個元素是否屬於某一集合

在上述集合運算中,我們只關心兩個集合運算,為並查集:集合並和查某元素屬於什麼集合。因此有乙個問題——並查集問題中集合儲存如何實現?

對於上述問題,我們可以用樹結構表示集合,樹的每個結點代表乙個集合元素

例如:有以下三個整數集合

s1 =

s2 =

s3 =

對於上述三個集合,我們可以使用雙親表示法(孩子指向雙親)來構造下圖所示樹結構:

對於上述的樹結構,我們可以考慮使用陣列儲存,儲存形式如下圖所示:

負數表示根結點;非負數表示雙親結點的下標。

對於陣列中的每個元素,我們可以使用如下所示的**描述:

/* c語言實現 */

typedef struct settype;

# python語言實現

class treenode:

def __init__(self, x):

self.data = none

self.parent = none

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

/* c語言實現 */

int find(settype s, elementtype x)

分別找到x1和x2兩個元素所在集合樹的根結點

如果它們不同根,則將其中乙個根結點的父結點指標設定成另個乙個根結點的陣列下標

/* c語言實現 */

void union(settype s, elementtype x1, elementtype x2)

下圖所示為集合 和 集合 的並運算:

對於上述的兩個小集合,隨意選擇乙個根結點並無太大影響,但是對於如下圖所示的兩個集合,隨意選擇根結點則會增加未來並集的查詢效率:

對於上圖所示的兩個集合,如果要增加未來兩個集合並集的查詢效率,應該盡量採用小的集合合併到相對大的集合中,但是我們如何判斷哪乙個集合元素更多呢?

為了更高效的判斷那個集合元素更多,我們可以把根結點的-1改成-7或-3,用根結點的絕對值表示集合元素的個數,即陣列更改為如下圖所示:

其中-7表示根結點資料為1的集合有7個元素;其中-3表示根結點資料為6的集合有3個元素。

集合及運算

並查集問題中集合儲存如何實現?可以用樹結構表示集合,樹的每個結點代表乙個集合元素 採用陣列儲存形式 陣列中每個元素的型別描述為 1 查詢某個元素所在的集合 用根結點表示 int find settype s,elementtype x 2 集合的並運算 void union settype s,el...

python集合補運算 Python集合及其運算

集合 set 集合是由不同可hash的值組成的,裡面所有的值都是唯一的,也是無序的 集合的建立 set test 把值放入中 lis name age hometown set test set lis set test 利用set 函式,把其他型別轉換為set list test name age...

python集合型別及運算

集合型別與數學中的集合概念相同,表示多個元素的無序組合 集合元素之間無序,但是每個元素唯一,不存在相同元素 集合元素不可更改,不能是可變資料型別 為了保證元素的唯一性 集合用大括號 表示,元素間用逗號分隔 建立集合型別用 或 set a集合是集合b的子集 else print a集合不是集合b的子集...