Do sorted ranges have any special properties?
Tomek Sowiński
just at ask.me
Sun Jul 25 12:44:36 PDT 2010
Andrei Alexandrescu wrote:
> I'm trying to find justifications for keeping assumeSorted and friends
> within Phobos. Background: assumeSorted(r) where r is some range returns
> a value that wraps r and clarifies to the caller that it can assume r
> has been sorted.
>
> The obvious use case in Phobos is that find(haystack, needle) can
> proceed faster if haystack == assumeSorted(something).
>
> The nicest way to go about this is to make the type returned by
> assumeSorted a kind of "range with benefits". That is, it would
> implement all range primitives, plus a few more primitives that are
> advantageous for sorted ranges. Question is: what are those? What kind
> of cool primitives could a sorted range define?
>
> Here are a few I can think of:
>
> find -> uses binary search if random-access, or at least early stopping
> otherwise.
>
> minElement -> r.front
>
> maxElement -> r.back
>
> topN -> essentially does nothing
>
> median -> r[r.length / 2]
>
> Such functions could have free counterparts in std.algorithm. The free
> functions check whether the range already implements the fast functions
> and uses them transparently if present. So then we have e.g. find()
> which works in linear time for most ranges, but logarithmic time on
> random-access sorted ranges.
Sort of trivial, but I'd like to see the predicate with which it's sorted.
Also, I can't stop thinking that it's stand-alone find()'s job utilize
whatever features the range has (be it random access, sortedness, or
anything else) to execute fast, not the passed in range's.
Checking for a member find() sounds good but doesn't have anything specific
to do with the range being sorted. Any range could define its find() to
special-case on its structure.
BTW, would it be a big deal if sort() returned assumeSorted!Range? Many uses
are a re-sort + binary search combo.
Tomek
More information about the Digitalmars-d
mailing list