4

我知道答案是使用中位数的中位数,但有人能解释一下怎么做吗?

4

3 回答 3

1

有线性时间算法可以做到这一点,这个页面可能会有所帮助,http ://en.wikipedia.org/wiki/Selection_algorithm ,如果你仍然感到困惑,请问

基本上,选择算法的工作方式类似于快速排序,但每次仅在枢轴一侧进行排序。目标是保持分区,直到您选择的枢轴等于您尝试查找的元素的索引。这是我为快速选择找到的 java 代码:

public static int selectKth(int[] arr, int k) {
 if (arr == null || arr.length <= k)
  throw new Error();

 int from = 0, to = arr.length - 1;

 // if from == to we reached the kth element
 while (from < to) {
  int r = from, w = to;
  int mid = arr[(r + w) / 2];

  // stop if the reader and writer meets
  while (r < w) {

   if (arr[r] >= mid) { // put the large values at the end
    int tmp = arr[w];
    arr[w] = arr[r];
    arr[r] = tmp;
    w--;
   } else { // the value is smaller than the pivot, skip
    r++;
   }
  }

  // if we stepped up (r++) we need to step one down
  if (arr[r] > mid)
   r--;

  // the r pointer is on the end of the first k elements
  if (k <= r) {
   to = r;
  } else {
   from = r + 1;
  }
 }

 return arr[k];
}
于 2013-05-04T18:27:40.537 回答
0

这是中位数算法的中位数。看一下这个

于 2013-05-04T18:29:33.830 回答
0

请参阅此问题的前两个答案。如果第一个(频率计数)适用于您的数据/可用存储,您可以通过这种方式获得确切的答案。第二种(补救方法)是一种稳健的通用方法。

于 2013-05-04T19:28:08.103 回答