什么是不🍌集合
不相交集合维护了一个不相交动态集的集合,选用一个代表元素来标识每个集合,并不关心哪个元素作为代表(当然,还是有一定的选取规则)。
动态集合支持的操作:
- Make-Set(x) 建立一个新的集合,它的成员唯一且仅出现在此集合中(因为不相交)。
- Union(x,y)将包含x和y的两个动态集合(不一定是单一成员集合)合并成一个新的集合,选取两个集合中的任意元素作为代表。
- Find-Set(x) 返回一个指针,这个指针指向包含x的集合的代表。(这个集合是唯一的)
不相交集合的链表表示
每个集合都有自己的一个链表。每个集合包含head和tail属性,head指向第一个对象,tail指向最后一个对象。链表的每个对象都有一个集合成员(也就是本身),一个指向下一个对象的指针,一个回到集合对象的指针。代表是链表中的第一个对象。
链表表示下Make-Set(x)和Find-Set(x)都是O(1)的复杂度,但Union操作会随着链表的增长消耗大量时间。
改进方法是用一种所谓加权合并启发式策略,在每个链表上维护一个长度变量,合并时总是把短的链表合并到长链表的后面,这样Union操作的时间成本会降低。
更快的实现
用树来表示集合,每棵树的根就是集合的代表,而且根是自己的父节点,每个成员仅指向自己的父节点。
在这种实现