Short-circuit range counting algorithm?

H. S. Teoh hsteoh at quickfur.ath.cx
Fri Mar 16 19:10:59 UTC 2018


On Fri, Mar 16, 2018 at 02:58:36PM -0400, Steven Schveighoffer via Digitalmars-d wrote:
> On 3/16/18 2:07 PM, Seb wrote:
> > On Friday, 16 March 2018 at 17:50:37 UTC, Andrei Alexandrescu wrote:
> > > On 3/16/18 1:41 PM, H. S. Teoh wrote:
> > > > Given a forward range r, I want to test whether it has exactly n
> > > > elements that satisfy some given predicate pred.  Is it possible
> > > > to do this using current Phobos algorithms such that it does not
> > > > traverse more members of the range than necessary?
> > > > 
> > > > The naïve solution `r.count!pred == n` walks the entire range,
> > > > even though it may already have seen n+1 elements that satisfies
> > > > pred, and therefore should already know that the answer must be
> > > > false.
> > > 
> > > r.count!pred.walkLength(n) == n
> > 
> > Shouldn't this be using filter (count is eager)?
> > 
> > r.filter!pred.walkLength(n) == n
> 
> r.filter!pred.walkLength(n + 1) == n
[...]

Aha, so the trick is the 2-argument overload of walkLength.  That's what
I was looking for.  Thanks!

And yes, it should be .walkLength(n+1) because otherwise you don't know
if the actual count is >n.


T

-- 
Don't drink and derive. Alcohol and algebra don't mix.


More information about the Digitalmars-d mailing list