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 !RefUnwindSafe for UnionFind
impl Send for UnionFind
impl !Sync for UnionFind
impl Unpin 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