C 樹的應用(二) 集合及其運算

2021-10-03 11:55:42 字數 3476 閱讀 5067

本文為浙大版《資料結構》學習筆記。

可用樹的結構表示集合,樹的每個結點表示乙個集合元素。

定義乙個結構陣列,其中乙個變數儲存集合中元素的數值,另乙個變數儲存元素的父結點(即所屬集合)。若為根結點,令其父結點為負值(不存在)。

集合的型別描述:

#define maxsize 15

typedef

int elementtype;

struct settype

;

(一)查詢

/*查詢元素x所屬集合的根結點在陣列中的下標*/

intfind

(settype s[

],elementtype x)

(二)合併

void

union

(settype s[

],elementtype x1,elementtype x2)

else

}

將集合中的n個元素對映為整數0~n-1,可直接用陣列的下標表示集合中的元素,陣列中儲存元素的父結點所在的位置。

集合的型別描述:

#define maxn 10

typedef

int elementtype;

typedef

int setname;

typedef elementtype settype[maxn]

;

(一)查詢查詢編號為x的元素所屬集合(返回根結點在陣列中的下標)

1.普通查詢

沿著該元素的父結點一級一級往上查,當發現乙個元素的指標值域為負數,該元素就是x所屬集合的樹根結點。

/*尋找x所在的集合(用根結點在陣列中的下標表示*/

setname find1

(settype s,elementtype x)

2.路徑壓縮

在第一次查詢時,使得所有被遍歷元素直接變為根結點的孩子,這樣,當下次再查詢時,就不用再一級一級比較,只需比較兩次就夠了。可用遞迴實現。

/*(路徑壓縮)尋找x所在的集合(用根結點在陣列中的下標表示*/

setname find

(settype s,elementtype x)

(二)並運算將元素x1和x2所屬的兩個集合進行合併,找到兩個元素所在集合樹的根結點,如果不同根,則將其中乙個根結點的父結點值域設定成另乙個根結點的陣列下標。

1.隨意合併

不管集合的大小,直接將乙個集合合併入另乙個集合。

/*隨意合併,效率不高*/

void

union1

(settype s,setname root1,setname root2)

2.按秩合併

將規模(高度)較小的集合合併到規模(高度)較大的集合中,這樣可減緩集合規模的增長,提高遍歷的效率。

/*按秩合併*/

void

union

(settype s,setname root1,setname root2)

else

}

可直接執行的程式:

#include

#define maxn 10

typedef

int elementtype;

typedef

int setname;

typedef elementtype settype[maxn]

;using

namespace std;

intmain()

;union

(s,1,3

);cout<<

find

(s,5

)<

return0;

}/*尋找x所在的集合(用根結點在陣列中的下標表示*/

setname find1

(settype s,elementtype x)

/*(路徑壓縮)尋找x所在的集合(用根結點在陣列中的下標表示*/

setname find

(settype s,elementtype x)

/*隨意合併,效率不高*/

void

union1

(settype s,setname root1,setname root2)

/*按秩合併*/

void

union

(settype s,setname root1,setname root2)

else

}

判斷聯通問題(兩個元素是否屬於同乙個集合)

題目描述:

}/*(路徑壓縮)尋找x所在的集合(用根結點在陣列中的下標表示*/

setname find

(settype s,elementtype x)

/*按秩合併*/

void

union

(settype s,setname root1,setname root2)

else

}/*初始化集合*/

void

initialization

(settype s,

int n)

/*將兩個元素併入同一集合(聯通路徑)*/

void

input_connection

(settype s)

/*判斷兩個元素是否屬於同一集合*/

void

check_connection

(settype s)

/*檢視元素是否完全聯通*/

void

check_network

(settype s,

int n)

java基礎 二 集合

集合 集合的頂層介面iterator 單列集合的頂層介面collection 雙列集合的頂層介面map arraylist 底層實現是陣列 查詢快 增刪比較慢 預設大小是10 擴容為1.5 元素可重複 linkedlist 底層是鍊錶 查詢慢 增刪快 元素可重複 hashset 底層實現是hashm...

redis學習筆記 二 集合型別

一 集合型別的常用操作是向集合中加入或刪除元素 判斷某個元素是否存在。1.增加 刪除元素 sadd srem key member member redis 127.0.0.1 6379 sadd letters a integer 1 redis 127.0.0.1 6379 sadd lette...

資料結構(二) 集合 字典

集合 es6 set 無序且唯一。與陣列的區別,無序可重複。leetcode 349.var arr 1,2,2,3 const set new set arr 去重 const newarr set set.add add data set.delete del data set.has 2 tr...