medianOfMedians

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Tue Jan 19 18:26:35 PST 2016


On 01/20/2016 02:20 AM, Andrei Alexandrescu wrote:
> I've seldom have code write itself so beautifully. Which, of course,
> means it needs to be destroyed.
> https://github.com/D-Programming-Language/phobos/pull/3938 -- Andrei

This is not an implementation of the median of medians algorithm.

int[] bad(int n){
     if(n<=5){ return iota(n).array; }
     auto next=bad(n/5);
     return next.map!(a=>[a-2,a-1,a,a+n,a+n+1]).join;
}

void main(){
     import std.stdio;
     auto a=bad(5^^10);
     auto idx=medianOfMedians(a);
     double notLarger=a.count!(x=>x<=a[idx])/(1.0*a.length);
     writeln(notLarger); // 0.0100766
     assert(notLarger>=0.3); // fail
}

The real algorithm works by computing an /exact/ median of the medians 
and uses it as the pivot value for quickselect in order to compute the 
precise median of the full array. In the given implementation, the 
approximations accumulate with each recursive invocation and no constant 
guarantees can be given on the percentile of the result.


More information about the Digitalmars-d mailing list