let run_test dim num_points s n =
  let data = random_data dim num_points in
  let t_balanced = create_balanced data in
  let t_unbalanced = fold_left (fun t (x,y) -> add x y t) empty data in
  let total_balanced = ref 0. in
  let total_unbalanced = ref 0. in
  for i = 1 to n do
    let x = random_float_list dim in
    let nearest_dist =
      let dists = map (fun p -> dist x (fst p)) data in
      match select (<) 1 dists with
      |        ((nearest_dist :: _), _) -> nearest_dist in
    let balanced_dist =
      match hd (find_k_nearest t_balanced 1 s x) with
      |        (d, _, _) -> d in
    let unbalanced_dist =
      match hd (find_k_nearest t_unbalanced 1 s x) with
      |        (d, _, _) -> d in
    total_balanced := !total_balanced +. (balanced_dist /. nearest_dist);
    total_unbalanced := !total_unbalanced +. (unbalanced_dist /. nearest_dist)
  done;
  print_float (!total_balanced /. (float_of_int n));
  print_string "\t";
  print_float (!total_unbalanced /. (float_of_int n));
  print_string "\n"