std.algorithm.setops.n_way_union
- multiple declarations
- Function nWayUnion
- Struct NWayUnion
Function nWayUnion
Computes the union of multiple sets. The input sets are passed as a
range of ranges and each is assumed to be sorted by less
. Computation is done lazily, one union element at a time. The
complexity of one popFront
operation is Ο(log(ror.length)
). However, the length of
decreases as ranges
in it are exhausted, so the complexity of a full pass through ror
is dependent on the distribution of the lengths of ranges
contained within NWayUnion
. If all ranges have the same length ror
n
(worst case scenario), the complexity of a full pass through
is Ο(NWayUnion
n * ror.length * log(ror.length)
), i.e., log(ror.length)
times worse than just spanning all ranges in
turn. The output comes sorted (unstably) by less
.
Prototype
NWayUnion!(less,RangeOfRanges) nWayUnion(alias less, RangeOfRanges)( RangeOfRanges ror );
Parameters
Name | Description |
---|---|
less | Predicate the given ranges are sorted by. |
ror | A range of ranges sorted by less to compute the union for. |
Returns
A range of the union of the ranges in
.
ror
Warning
Because
does not allocate extra memory, it
will leave NWayUnion
modified. Namely, ror
assumes ownership
of NWayUnion
and discretionarily swaps and advances elements of it. If
you want ror
to preserve its contents after the call, you may
want to pass a duplicate to ror
(and perhaps cache the
duplicate in between calls).
NWayUnion
Example
import std.algorithm.comparison : equal; double[][] a = [ [ 1, 4, 7, 8 ], [ 1, 7 ], [ 1, 7, 8], [ 4 ], [ 7 ], ]; auto witness = [ 1, 1, 1, 4, 4, 7, 7, 7, 7, 8, 8 ]; assert(equal(nWayUnion(a), witness));
Struct NWayUnion
Computes the union of multiple sets. The input sets are passed as a
range of ranges and each is assumed to be sorted by less
. Computation is done lazily, one union element at a time. The
complexity of one popFront
operation is Ο(log(ror.length)
). However, the length of ror
decreases as ranges
in it are exhausted, so the complexity of a full pass through
is dependent on the distribution of the lengths of ranges
contained within NWayUnion
ror
. If all ranges have the same length n
(worst case scenario), the complexity of a full pass through
is Ο(NWayUnion
n * ror.length * log(ror.length)
), i.e., log(ror.length)
times worse than just spanning all ranges in
turn. The output comes sorted (unstably) by less
.
Parameters
Name | Description |
---|---|
less | Predicate the given ranges are sorted by. |
ror | A range of ranges sorted by less to compute the union for. |
Returns
A range of the union of the ranges in ror
.
Warning
Because
does not allocate extra memory, it
will leave NWayUnion
ror
modified. Namely,
assumes ownership
of NWayUnion
ror
and discretionarily swaps and advances elements of it. If
you want ror
to preserve its contents after the call, you may
want to pass a duplicate to
(and perhaps cache the
duplicate in between calls).
NWayUnion
Example
import std.algorithm.comparison : equal; double[][] a = [ [ 1, 4, 7, 8 ], [ 1, 7 ], [ 1, 7, 8], [ 4 ], [ 7 ], ]; auto witness = [ 1, 1, 1, 4, 4, 7, 7, 7, 7, 8, 8 ]; assert(equal(nWayUnion(a), witness));