pub struct UnionFind { /* private fields */ }Expand description
union-find。
§Complexity
| 演算 | 時間計算量 |
|---|---|
new | $\Theta(n)$ |
unite | amortized $O(\alpha(n))$ |
repr | amortized $O(\alpha(n))$ |
equiv | amortized $O(\alpha(n))$ |
count | amortized $O(\alpha(n))$ |
subset | $\Theta(n)$ |
より tight には、$n$ 要素 $m$ クエリのとき、$O(m\cdot\alpha(m, n)+n)$ 時間となる。 ただし、$\alpha(m, n)$ は次のように定義される。 $$ \alpha(m, n) = \min\{k\in\mathbb{N}\mid J_k(\lfloor\log_2(n)\rfloor)\le 1+m/n\}. $$ ここで、$g^\diamond = (\lceil{\log_2}\rceil\circ g)^\star$ とし、$J_0(r) = \lceil(r-1)/2\rceil$, $J_k(r)=J_{k-1}^\diamond(r)$ ($k\gt 0$) である。 より直感的には、${\underbrace{J_0^{\diamond\diamond\cdots\diamond}}_{k\text{ many }\diamond{\text{s}}}}(\lfloor\log_2(n)\rfloor)$ が $1+m/n$ 以下になる最小の $k$ が $\alpha(m, n)$ である。
§Complexity analysis
参考文献ふたつめの PDF の概略を書く。todo!()
これらより、$f(m, n, r)\le (\alpha(m, n)+2)\cdot m+2n$ が言える。
Note: $\alpha'(m, n) = \min\{k\in\mathbb{N}\mid \alpha_k(n)\le 3\}$ として $\alpha(m, n) = O(\alpha'(m, n))$ である。
§Examples
use nekolib::traits::DisjointSet;
use nekolib::ds::UnionFind;
let mut uf = UnionFind::new(4);
assert!(!uf.equiv(0, 2));
uf.unite(0, 1);
uf.unite(1, 2);
assert!(uf.equiv(0, 2));
assert!(!uf.equiv(0, 3));
assert_eq!(uf.count(0), 3);§References
Trait Implementations§
Auto Trait Implementations§
impl !Freeze for UnionFind
impl !RefUnwindSafe for UnionFind
impl Send for UnionFind
impl !Sync for UnionFind
impl Unpin for UnionFind
impl UnsafeUnpin for UnionFind
impl UnwindSafe for UnionFind
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more