40 lines
1.4 KiB
Markdown
40 lines
1.4 KiB
Markdown
|
# Some implementations in OCaml of the Union/Find algorithm
|
||
|
|
||
|
All modules implementing Union/Find can be coerced by the same
|
||
|
signature `Partition.S`.
|
||
|
|
||
|
Note the function `alias` which is equivalent to `equiv`, but not
|
||
|
symmetric: `alias x y` means that `x` is an alias of `y`, which
|
||
|
translates in the present context as `x` not being the representative
|
||
|
of the equivalence class containing the equivalence between `x` and
|
||
|
`y`. The function `alias` is useful when managing aliases during the
|
||
|
static analyses of programming languages, so the representatives of
|
||
|
the classes are always the original object.
|
||
|
|
||
|
The module `PartitionMain` tests each with the same equivalence
|
||
|
relations.
|
||
|
|
||
|
## `Partition0.ml`
|
||
|
|
||
|
This is a naive, persistent implementation of Union/Find featuring an
|
||
|
asymptotic worst case cost of O(n^2).
|
||
|
|
||
|
## `Partition1.ml`
|
||
|
|
||
|
This is a persistent implementation of Union/Find with height-balanced
|
||
|
forests and without path compression, featuring an asymptotic worst
|
||
|
case cost of O(n*log(n)).
|
||
|
|
||
|
## `Partition2.ml`
|
||
|
|
||
|
This is an alternate version of `Partition1.ml`, using a different
|
||
|
data type.
|
||
|
|
||
|
## `Partition3.ml`
|
||
|
|
||
|
This is a destructive implementation of Union/Find with
|
||
|
height-balanced forests but without path compression, featuring an
|
||
|
asymptotic worst case of O(n*log(n)). In practice, though, this
|
||
|
implementation should be faster than the previous ones, due to a
|
||
|
smaller multiplicative constant term.
|