digitalmars.D.learn - using std.algorithm to find intersection of DateTime[][] arg
- Laeeth Isharc (12/12) Sep 09 2015 I have a DateTime[][] arg (actually my own date type, but that
- Sebastiaan Koppe (3/3) Sep 09 2015 Couldn't you use setIntersection together with reduce?
- Artem Tarasov (4/12) Sep 09 2015 I'd use something like this, it works in O(Σ|arg[i]| *
- deed (16/18) Sep 10 2015 A suggestion:
- Laeeth Isharc (4/22) Sep 11 2015 Thank you for this - exactly what I was looking for - and for the
I have a DateTime[][] arg (actually my own date type, but that shouldnt matter). Ordered by time series ticker (eg a stock) and then the date. eg arg[0] might be the dates relating to IBM and arg[0][0] would be the date of the first point in IBM time series. I would like to find the intersection of the dates. so setIntersection(arg[0],arg[1],arg[2] .. arg[$-1]) except that I don't know how many series are in arg at compile time. what's the most efficient way to use Phobos to find these? (I could write a loop, but I am trying to learn how to use std.algorithm better).
Sep 09 2015
Couldn't you use setIntersection together with reduce? Doesn't seem like the most efficient solution, but its less typing and most likely will have no bugs.
Sep 09 2015
On Wednesday, 9 September 2015 at 20:28:35 UTC, Laeeth Isharc wrote:so setIntersection(arg[0],arg[1],arg[2] .. arg[$-1]) except that I don't know how many series are in arg at compile time. what's the most efficient way to use Phobos to find these? (I could write a loop, but I am trying to learn how to use std.algorithm better).I'd use something like this, it works in O(Σ|arg[i]| * log|arg.length|)arg.nWayUnion.group.filter!(g => g[1] == arg.length).map!(g => g[0]).array
Sep 09 2015
On Wednesday, 9 September 2015 at 20:28:35 UTC, Laeeth Isharc wrote:I have a DateTime[][] arg ... I would like to find the intersection of the dates.A suggestion: auto minLength = arg.map!(a => a.length).reduce!min; auto minIdx = arg.map!(a => a.length).countUntil(minLength); auto intersection = arg[minIdx].filter!(e => chain(arg[0..minIdx], arg[minIdx..$]).all!(a => a.assumeSorted.contains(e))); reduce with setIntersection seems the most straightforward, but needs array AFAIK, i.e.: auto intersection = //reduce!((r, x) => setIntersection(r, x))(arg); // doesn't work reduce!((r, x) => setIntersection(r, x).array)(arg);// does, but with array
Sep 10 2015
On Thursday, 10 September 2015 at 11:58:10 UTC, deed wrote:On Wednesday, 9 September 2015 at 20:28:35 UTC, Laeeth Isharc wrote:Thank you for this - exactly what I was looking for - and for the other answer. Laeeth.I have a DateTime[][] arg ... I would like to find the intersection of the dates.A suggestion: auto minLength = arg.map!(a => a.length).reduce!min; auto minIdx = arg.map!(a => a.length).countUntil(minLength); auto intersection = arg[minIdx].filter!(e => chain(arg[0..minIdx], arg[minIdx..$]).all!(a => a.assumeSorted.contains(e))); reduce with setIntersection seems the most straightforward, but needs array AFAIK, i.e.: auto intersection = //reduce!((r, x) => setIntersection(r, x))(arg); // doesn't work reduce!((r, x) => setIntersection(r, x).array)(arg);// does, but with array
Sep 11 2015