Binary search

tsbockman via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Dec 14 16:55:19 PST 2015


On Tuesday, 15 December 2015 at 00:31:45 UTC, Jakob Ovrum wrote:
> On Tuesday, 15 December 2015 at 00:22:37 UTC, tsbockman wrote:
>> I also found `SortedRange.equalRange`, but that sounds like it 
>> has an unreasonable amount of (admittedly O(1)) overhead for 
>> the (extremely common) case in which I am looking for only a 
>> single element, not a range.
>
> If your array doesn't contain duplicates, the overhead is just 
> one extra comparison.

Actually, it's two I think - `equalRange` calls both `upperBound` 
and `lowerBound` after the main search.

> For cheap comparisons, this overhead will be completely dwarfed 
> by the actual search (assuming your array is big enough to 
> justify binary search over linear search). If your array 
> contains duplicates but you are only interested in getting any 
> one of them, or your comparison is non-trivial, then I agree 
> this could potentially be a problem.

I think there are cases where the difference would be meaningful, 
although I agree that most of the time it wouldn't be noticeable.

> For sorted arrays you won't find any other standard facility 
> for doing binary search, but the containers RedBlackTree and 
> BinaryHeap provide something related.
>
> You could also get the upper bound (SortedRange.upperBound) and
> calculate the index from its length. If I'm thinking straight,
> this might result in fewer comparisons for some patterns.

OK. Thanks for the advice.


More information about the Digitalmars-d-learn mailing list