in not working for arrays is silly, change my view

aliak something at something.com
Mon Mar 2 20:52:48 UTC 2020


On Monday, 2 March 2020 at 15:47:26 UTC, Steven Schveighoffer 
wrote:
> On 3/2/20 6:52 AM, Andrea Fontana wrote:
>> On Saturday, 29 February 2020 at 20:11:24 UTC, Steven 
>> Schveighoffer wrote:
>>> 1. in is supposed to be O(lg(n)) or better. Generic code may 
>>> depend on this property. Searching an array is O(n).
>> 
>> Probably it should work if we're using a "SortedRange".
>> 
>> 
>> int[] a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
>> auto p = assumeSorted(a);
>> 
>> assert(3 in p);
>> 
>> 
>
> That could work. Currently, you need to use p.contains(3). opIn 
> could be added as a shortcut.
>
> It only makes sense if you have it as a literal though, as 
> p.contains(3) isn't that bad to use:
>
> assert(3 in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].assumeSorted);
>
> -Steve

There's no guarantee that checking if a value is in a sorted list 
is any faster than checking if it's in a non sorted list. It's 
why sort usually switches from a binary-esque algorithm to a 
linear one at a certain size. The list could potentially need to 
be _very_ large for p.contains to make a significant impact over 
canFind(p) AFAIK.

Here's a small test program, try playing with the numbers and see 
what happens:

import std.random;
import std.range;
import std.algorithm;
import std.datetime.stopwatch;
import std.stdio;

void main()
{
     auto count = 1_000;
     auto max = int.max;

     alias randoms = generate!(() => uniform(0, max));

     auto r1 = randoms.take(count).array;
     auto r2 = r1.dup.sort;
     auto elem = r1[uniform(0, count)];

     benchmark!(
         () => r1.canFind(elem),
         () => r2.contains(elem),
     )(1_000).writeln;
}

Use LDC and -O3 of course. I was hard pressed to get the sorted 
contains to be any faster than canFind.

This begs the question then: do these requirements on in make any 
sense? An algorithm can be log n (ala the sorted search) but 
still be a magnitude slower than a linear search... what has the 
world come to 🤦‍♂️

PS: Why is it named contains if it's on a SortedRange and canFind 
otherwise?



More information about the Digitalmars-d-learn mailing list