演算法導論第21章 不相交集合 鍊錶表示

2021-06-19 23:09:03 字數 1989 閱讀 1660

乙個不相交資料結構維護了乙個不相交動態集的集合s = ,用乙個代表來標示每個集合,這個代表是集合中的任意乙個元素。

支援一下三種操作:

1、makeset(x):建立乙個新的集合,成員為x,因為各個集合是不相交的,故不出現在任何其他集合中。

2、uinon(x, y):將包含x和y的兩個集合合併成乙個新的集合,即為這兩個集合的並集。

3、findset(x):返回乙個指標,這個指標指向包含x的集合的代表。

乙個實現不相交集合的資料結構是鍊錶表示:每個集合用乙個自己的鍊錶來表示,每個集合的物件包含head屬性和tail屬性,head屬性指向標的第乙個物件,tail屬性指向標的最後乙個物件。集合的代表是鍊錶中第乙個物件的集合物件。

書上寫的findset僅需要沿著x物件的返回指標返回到集合物件,然後返回head指向物件的成員,難道他的x指的是這個結點的指標嗎?哎,我給出的是節點值,得遍歷鍊錶找,花銷為o(n)...因為找到這個節點要遍歷整個集合.....

union是將含有少的結點的集合連線到大的集合中,在每個集合的鍊錶的頭結點中記錄該集合的個數。

但是為了保持資料一致性,我寫的這個實際上data只能是int,才能在頭結點中使用記錄個數的整數t_t,還是寫的很差啊,哎

誰知道到底應該怎麼寫的?

下面是我的。。。

表示的集合是相當於書上演算法導論第三ban326頁的集合

#include #include //#include using namespace std;

template struct linknode

};template class disjlinkset

} //使val成為乙個單獨的集合

void makeset(datatype val)

//找到val所在的集合,並且返回集合的頭結點

lnode *findset(datatype val)

}return null;

} //將較短的表接在較長的表中, 輸入為兩個元素,

//輸出為較長表的表頭結點的head結點的元素值

datatype unionset(datatype vx, datatype vy)

x->data += y->data;

//將y所在鍊錶的表頭清空

y->head = y;

y->tail = y;

y->data = 0;

return x->head->data;

} else

y->data += x->data;

//將x所在鍊錶的表頭清空

x->head = x;

x->tail = x;

x->data = 0;

return y->head->data;

} } //顯示各個集合的元素

void display()

cout << node->data << " ";

}cout << endl;

} cout << "*******************************" << endl;

} //刪除各個集合的元素

void destory()

delete node;

node = null;

}} }

private:

int num; //總共有的元素個數

vectorlnvec; //存放集合的頭結點

static int i; //使每個結點成為單獨集合時使用的陣列序號

};int disjlinkset::i = 0;

int main()

執行結果為:

演算法導論習題解 第21章用於不相交集合的資料結構

習題編號以第3版為準 解 a 根據第7行和第9行,檢查pair總是在其中乙個節點被加黑的時候進行。對於,會在v1被加黑的時候檢查一次,在v2被加黑的時候檢查一次,對於先加黑的節點而言此時另乙個節點尚未加黑,故第10行只會輸出一次。b 對於節點u,lca u 執行完畢時,以u為根的子樹都在同乙個集合裡...

演算法導論筆記 21用於不相交集合的資料結構

在某些應用中,要將 n個不同的元素分成一組不相交的集合。不相交集合上有兩個重要操作,即找出給定的元素所屬的集合和合併兩個集合。一 不相交集合的操作 不相交集合教據結構維護一組不相交的動態集合的集合s 每個集合通過乙個代表來識別,代表是集合中的某個成員,在某些應用中,哪乙個成員被選作代表是無所謂的,但...

第8章 不相交集類

等價關係是滿足下列三個性質的關係r 1.自反性 對於所有的a屬於s,ara。2.對稱性 arb 當且僅當 bra。3.傳遞性 若arb且brc則arc。不相交集合 union 不是最好的方法 1 public class disjsets29 public void union int root1,...