medianOfMedians

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Tue Jan 19 20:36:41 PST 2016


On 01/19/2016 09:26 PM, Timon Gehr wrote:
> 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.

Thanks. Urgh. So the approximate median part cannot be separated from 
partitioning. It was suspiciously cute :o). Back to the drawing board. 
-- Andrei



More information about the Digitalmars-d mailing list