Copyright | (C) 2015 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | experimental |
Portability | non-portable |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Synopsis
- data LinkCut a s
- new :: PrimMonad m => a -> m (LinkCut a (PrimState m))
- link :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> LinkCut a (PrimState m) -> m ()
- cut :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> m ()
- root :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> m (LinkCut a (PrimState m))
- cost :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> m a
- parent :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> m (LinkCut a (PrimState m))
- connected :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> LinkCut a (PrimState m) -> m Bool
Documentation
Amortized Link-Cut trees via splay trees based on Tarjan's little book.
These support O(log n) operations for a lot of stuff.
The parameter a
is an arbitrary user-supplied monoid that will be summarized
along the path to the root of the tree.
In this example the choice of Monoid
is String
, so we can get a textual description of the path to the root.
>>>
x <- new "x"
>>>
y <- new "y"
>>>
link x y -- now x is a child of y
>>>
x == y
False>>>
connected x y
True>>>
z <- new "z"
>>>
link z x -- now z is a child of y
>>>
(y ==) <$> root z
True>>>
cost z
"yxz">>>
w <- new "w"
>>>
u <- new "u"
>>>
v <- new "v"
>>>
link u w
>>>
link v z
>>>
link w z
>>>
cost u
"yxzwu">>>
(y ==) <$> root v
True>>>
connected x v
True>>>
cut z
y x z y z ==> w v x w v u u
>>>
connected x v
False>>>
cost u
"zwu">>>
(z ==) <$> root v
True
new :: PrimMonad m => a -> m (LinkCut a (PrimState m)) Source #
O(1). Allocate a new link-cut tree with a given monoidal summary.
link :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> LinkCut a (PrimState m) -> m () Source #
cut :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> m () Source #
O(log n).
removes the linkage between cut
vv
upwards to whatever tree it was in, making v
a root node.
Repeated calls on the same value without intermediate accesses are O(1).
root :: (PrimMonad m, Monoid a) => LinkCut a (PrimState m) -> m (LinkCut a (PrimState m)) Source #
O(log n). Find the root of a tree.
Repeated calls on the same value without intermediate accesses are O(1).