std.algorithm.setops.MultiwayMerge/multiwayMerge
- multiple declarations
Function multiwayMerge
Merges 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
). However, the length of ror
decreases as ranges
in it are exhausted, so the complexity of a full pass through MultiwayMerge
is dependent on the distribution of the lengths of ranges
contained within ror
. If all ranges have the same length n
(worst case scenario), the complexity of a full pass through MultiwayMerge
is Ο(n * ror
), i.e., log(ror
times worse than just spanning all ranges in
turn. The output comes sorted (unstably) by less
.
The length of the resulting range is the sum of all lengths of the ranges passed as input. This means that all elements (duplicates included) are transferred to the resulting range.
For backward compatibility, multiwayMerge
is available under
the name nWayUnion
and MultiwayMerge
under the name of NWayUnion
.
Future code should use multiwayMerge
and MultiwayMerge
as nWayUnion
and NWayUnion
will be deprecated.
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 MultiwayMerge
does not allocate extra memory, it
will leave ror
modified. Namely, MultiwayMerge
assumes ownership
of 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 MultiwayMerge
(and perhaps cache the
duplicate in between calls).
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(multiwayMerge(a), witness));
double[][] b =
[
// range with duplicates
[ 1, 1, 4, 7, 8 ],
[ 7 ],
[ 1, 7, 8],
[ 4 ],
[ 7 ],
];
// duplicates are propagated to the resulting range
assert(equal(multiwayMerge(b), witness));
Struct MultiwayMerge
Merges 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
). However, the length of ror
decreases as ranges
in it are exhausted, so the complexity of a full pass through MultiwayMerge
is dependent on the distribution of the lengths of ranges
contained within ror
. If all ranges have the same length n
(worst case scenario), the complexity of a full pass through MultiwayMerge
is Ο(n * ror
), i.e., log(ror
times worse than just spanning all ranges in
turn. The output comes sorted (unstably) by less
.
struct MultiwayMerge(alias less, RangeOfRanges)
;
The length of the resulting range is the sum of all lengths of the ranges passed as input. This means that all elements (duplicates included) are transferred to the resulting range.
For backward compatibility, multiwayMerge
is available under
the name nWayUnion
and MultiwayMerge
under the name of NWayUnion
.
Future code should use multiwayMerge
and MultiwayMerge
as nWayUnion
and NWayUnion
will be deprecated.
Constructors
Name | Description |
---|---|
this
|
Properties
Name | Type | Description |
---|---|---|
empty [get]
|
bool | |
front [get]
|
auto |
Methods
Name | Description |
---|---|
compFront
|
|
popFront
|
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 MultiwayMerge
does not allocate extra memory, it
will leave ror
modified. Namely, MultiwayMerge
assumes ownership
of 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 MultiwayMerge
(and perhaps cache the
duplicate in between calls).
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(multiwayMerge(a), witness));
double[][] b =
[
// range with duplicates
[ 1, 1, 4, 7, 8 ],
[ 7 ],
[ 1, 7, 8],
[ 4 ],
[ 7 ],
];
// duplicates are propagated to the resulting range
assert(equal(multiwayMerge(b), witness));