【问题标题】:Median of medians select algorithm中位数选择算法的中位数
【发布时间】:2020-05-04 09:42:20
【问题描述】:

在过去的几天里,我一直在非常努力地编写这个算法,但没有成功。该代码有效,并且大多数时候它给了我正确的结果,但在某些情况下它会失败。例如对于这个数组 {3, 8, 1, 9, 10, 7, 6, 2, 5, 4} 和 k = 6,它应该给我 6 作为结果,但它给我 7。有人可以帮助我吗?我不知道是什么问题。

代码如下:

class MOMSelect {

static int median(int a[], int i, int n) {
    if(i <= n)
        Arrays.sort(a, i, n);
    else
        Arrays.sort(a, n, i);
    return a[n/2];
}

static int medianOfMediansSelect(int a[], int left, int right, int k) {
    int n = right - left + 1;
    int i;
    int[] medians = new int[(n + 4) / 5];
    for (i = 0; i < n/5; i++) {
        medians[i] = median(a, left + i * 5, 5);
    }
    if (i*5 < n) {
        medians[i] = median(a,left + i * 5, n % 5);
        i++;
    }
    int medianOfMedians = (i == 1)? medians[i - 1]: median(medians, 0, medians.length);
    int pivotIndex = partition(a, left, right, medianOfMedians);
    if (pivotIndex == k - 1) {
        return a[pivotIndex];
    }
    else if (pivotIndex - left > k - 1) {
        return medianOfMediansSelect(a, left, pivotIndex - 1, k);
    }
    else {
        return medianOfMediansSelect(a, pivotIndex + 1, right, k);
    }
}

static void swap(int[] a, int i, int j) {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

static int partition(int[] a, int left, int right, int x) {
    int i;
    for (i = left; i < right; i++)
        if (a[i] == x)
            break;
    swap(a, i, right);
    i = left;
    for (int j = left; j <= right - 1; j++) {
        if(a[j] <= x) {
            swap(a, i, j);
            i++;
        }
    }
    swap(a, i, right);
    return i;
}

public static void main(String[] args) {
    int a[] = {3, 8, 1, 9, 10, 7, 6, 2, 5, 4};
    int n = a.length;
    int k = 1;
    System.out.println(medianOfMediansSelect(a, 0, n - 1, k));
}
}

提前感谢大家

【问题讨论】:

  • Arrays.sort() 接收 (array, beginIndex, endIndex),而不是 (array, beginIndex, count),因为您尝试使用它。
  • 你应该调试,在这种情况下你可以发现@ardenit自己说的。

标签: java algorithm selection median-of-medians


【解决方案1】:

好的,我解决了。除了我对 Arrays.sort() 方法的不好理解之外,在 if 结构上还有一个愚蠢的错误,我检查了方法 medianOfMediansSelect() 上的 pivotPosition 值

更准确地说是这一行

else if (pivotIndex - left &gt; k - 1) {

我应该这样做

else if (pivotIndex &gt; k - 1) {

【讨论】:

  • 很高兴知道它有效,我想在周末工作。
【解决方案2】:

所以,我修改了您的 median 方法来解决问题。您应该检查Arrays.sort 方法以获得清晰的理解。

现在它给出6,对于k=6

就是这样,

   static int median(int a[], int i, int n)
   {
      Arrays.sort(a, i, i + n - 1);

      return a[i + n / 2];
   }

【讨论】:

  • 谢谢,它可以工作,但现在程序抛出这个异常“线程“主”java.lang.IllegalArgumentException:fromIndex(0)> toIndex(-1)中的异常“对于k = 8
猜你喜欢
  • 2013-10-25
  • 1970-01-01
  • 2020-06-21
  • 2012-02-18
  • 2017-03-15
  • 2018-05-20
  • 2021-11-14
  • 2015-08-07
  • 2012-01-18
相关资源
最近更新 更多