书接上回 union-find算法(并查集),先抛开上文中的
union
和
find
实现方式不谈。
并查集中,
union
和
find
有以下几种实现方式:
(1)
quick-find
:
find()
的时间复杂度是
O(1)
,
union()
的是
O(n)
;
(2)
quick-union
:
find()
的时间复杂度是
O(n)
,
union()
的是
O(1)
;
(3)
加权
quick-union
:优化
quick-union
的
find()
;
(4)
路径压缩的加权
quick-union
:优化加权
quick-union
的
find()
;
以上指的是单次操作的时间复杂度是,且
union
里调用find
所用的时间不算。
quick-find
保证当且仅当id[p]
等于id[q]
时p
和q
是连通的,即同一连通分量中所有触点在数组中的值全部相同。
比如有以下两个连通分量,标识符分别为9
和6
。
触点3
、8
、4
和9
属于分量9
;
触点5
、0
、1
、7
、2
和6
属于分量6
。
实现
union_find.h
#ifndef UNION_FIND
#define UNION_FIND
#include <vector>
class UF {
public:
UF(size_t N);
~UF();
size_t Count() const;
void Union1(size_t p, size_t q);
size_t Find1(size_t p) const;
private:
std::vector<size_t> id;
size_t count_;
};
#endif
union_find.cpp