stdlib: Add a simple union-find data structure
This commit is contained in:
parent
f28a9d8f52
commit
afa6d85d61
41
src/lib/UFind.rs
Normal file
41
src/lib/UFind.rs
Normal file
@ -0,0 +1,41 @@
|
||||
import option.none;
|
||||
import option.some;
|
||||
|
||||
// A very naive implementation of union-find with unsigned integer nodes.
|
||||
|
||||
tag node {
|
||||
elem(uint, option.t[uint]);
|
||||
}
|
||||
type ufind = rec(mutable vec[mutable node] nodes);
|
||||
|
||||
fn make() -> ufind {
|
||||
let vec[mutable node] v = vec(mutable elem(0u, none[uint]));
|
||||
_vec.pop[mutable node](v); // FIXME: botch
|
||||
ret rec(mutable nodes=v);
|
||||
}
|
||||
|
||||
fn make_set(&ufind ufnd, uint n) {
|
||||
ufnd.nodes += vec(mutable elem(n, none[uint]));
|
||||
}
|
||||
|
||||
fn find(&ufind ufnd, uint n) -> uint {
|
||||
alt (ufnd.nodes.(n)) {
|
||||
case (elem(_, ?parent_opt)) {
|
||||
alt (parent_opt) {
|
||||
case (none[uint]) { ret n; }
|
||||
case (some[uint](?m)) {
|
||||
// TODO: "be"
|
||||
ret find(ufnd, m);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn union(&ufind ufnd, uint m, uint n) {
|
||||
auto m_root = find(ufnd, m);
|
||||
auto n_root = find(ufnd, n);
|
||||
auto ptr = some[uint](n_root);
|
||||
ufnd.nodes.(m_root) = elem(m_root, ptr);
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ auth _str.pop_char = impure;
|
||||
auth _vec.shift = impure;
|
||||
auth _vec.unshift = impure;
|
||||
auth _vec.pop = impure;
|
||||
auth UFind.union = impure;
|
||||
|
||||
auth dbg = unsafe;
|
||||
|
||||
@ -81,6 +82,7 @@ mod bitv;
|
||||
mod sort;
|
||||
mod sha1;
|
||||
mod ebml;
|
||||
mod UFind;
|
||||
|
||||
// Local Variables:
|
||||
// mode: rust;
|
||||
|
Loading…
x
Reference in New Issue
Block a user