Fix a wasteful sort in sample_without_replacement

This commit is contained in:
octachron 2015-11-12 13:41:38 +02:00
parent 2bb6423109
commit de2a51d62e

View file

@ -100,11 +100,11 @@ let split i st =
let j = 1 + Random.State.int st (i-1) in let j = 1 + Random.State.int st (i-1) in
Some (j, i-j) Some (j, i-j)
let _diff_list l = let _diff_list ~last l =
let rec diff_list acc = function let rec diff_list acc = function
| [a;b] -> Some ( (b - a)::acc ) | [a] -> Some ( (last - a)::acc )
| a::( b::_ as r ) -> diff_list ( (b-a)::acc ) r | a::( b::_ as r ) -> diff_list ( (b-a)::acc ) r
| [_] | [] -> None | [] -> None
in in
diff_list [] l diff_list [] l
@ -118,8 +118,7 @@ let _diff_list l =
let split_list i ~len st = let split_list i ~len st =
if i >= len then if i >= len then
let xs = sample_without_replacement (len-1) (int_range 1 @@ i-1) st in let xs = sample_without_replacement (len-1) (int_range 1 @@ i-1) st in
let ordered_xs = List.sort compare (i::0::xs) in _diff_list ( 0::xs ) ~last:i
_diff_list ordered_xs
else else
None None