The Quick Mom Algorithm

Ivan Kazmenko via Digitalmars-d digitalmars-d at puremagic.com
Tue Feb 2 14:14:40 PST 2016


On Friday, 29 January 2016 at 22:47:44 UTC, Andrei Alexandrescu 
wrote:
> http://dpaste.dzfl.pl/05a82699acc8
>
> While thinking of MoM and the core reasons of its being slow 
> (adds nice structure to its input and then "forgets" most of it 
> when recursing), I stumbled upon a different algorithm. It's 
> much simpler, also deterministic and faster than MoM for many 
> (most?) inputs. But it's not guaranteed to be linear. After 
> having pounded at this for many hours, it is clear that I am in 
> need of some serious due destruction. I call it a "quick median 
> of medians" or in short "quick mom".

The code does not compile when I try to use topN, as medianOfUpTo 
is not present.  Please include it.

Anyway, for now, I just wanted to quickly check whether my 
previous attack on topN would have any effect here.

I've replaced the line
     if (r.length <= 5) return medianOfUpTo!(5, lp)(r);
with a quick fix:
     if (r.length == 2)
     {
         if (!less (r.front, r.back)) swap (r.front, r.back);
         return 0;
     }
     if (r.length == 1) return 0;

Here is the code (just glued together the two snippets):
http://dpaste.dzfl.pl/f648a600a11d

Turns out like maybe it does have its effect (size = 5 million):

building Element array: 2442 msecs
checking Element array: 2432 msecs
checking int array: 388 msecs
checking random int array: 140 msecs
checking increasing int array: 41 msecs
checking decreasing int array: 42 msecs

The int array built by the attack makes the program run slower 
than a random array, and the ratio increases with size.



More information about the Digitalmars-d mailing list