【问题标题】:Not understanding median of medians algorithm to find k-th element不了解中位数算法的中位数以找到第 k 个元素
【发布时间】:2015-06-22 07:33:27
【问题描述】:

下面是我试图理解中位数算法中位数的代码(使用大小为 5 的块)。我了解如何获得输入的中位数,但我不确定如何对块进行编码以继续递归输入,直到我只有中位数。然后在得到那个中值之后,我不知道如何用它作为一个支点来丢弃无用的信息来划分输入。 getMediansArray 返回大小为 ceil(input.length/5) 的数组,getMedians 仅返回数组的中位数(仅用于长度

public static int[] findKthElement(int[] input, int k) {
    int numOfMedians = (int) Math.ceil(input.length/5.0);
    int[] medians = new int[numOfMedians];
    medians = getMediansArray(input, medians)

    // (1) This only gets the first iteration of medians of the
    // input. How do I recurse on this until I just have one median?

    // (2) how should I partition about the pivot once I get it?
}

public static int[] getMediansArray(int[] input, int[] medians) {
    int numOfMedians = (int) Math.ceil(input.length/5.0);
    int[] five = new int[5];

    for (int i = 0; i < numOfMedians; i++) {
        if (i != numOfMedians - 1) {
            for (int j = 0; j < 5; j++) {
                five[j] = input[(i*5)+j];
            }
            medians[i] = getMedian(five);
        } else {
            int numOfRemainders = input.length % 5;
            int[] remainder = new int[numOfRemainders];
            for (int j = 0; j < numOfRemainders; j++) {
                remainder[j] = input[(i*5)+j];
            }
            medians[i] = getMedian(five);
        }
    }
    return medians;
}

public static int getMedian(int[] input) {
    Arrays.sort(input);
    if (input.length % 2 == 0) {
        return (input[input.length/2] + input[input.length/2 - 1]) / 2;
    }
    return input[input.length/2];
}

【问题讨论】:

    标签: java arrays algorithm median-of-medians


    【解决方案1】:

    中位数的中位数基本上只是快速选择算法(http://en.wikipedia.org/wiki/Quickselect)的改进。虽然快速选择的平均时间复杂度为 O(n),但对于棘手的输入,它可能会减慢到 O(n^2)。

    找到中位数后所做的只是快速选择算法的迭代。中位数的中位数有一个很好的属性,它总是大于 30% 的元素和小于 30% 的元素。这保证了使用中位数的中位数作为枢轴的快速选择将以 O(n) 的最坏时间复杂度运行。参考:http://en.wikipedia.org/wiki/Median_of_medians

    我建议您从实现快速选择开始。一旦你这样做了,你就可以使用你已经必须在快速选择的每个步骤中选择枢轴的代码。

    【讨论】:

      【解决方案2】:

      如果我没记错的话 (refreshing my memory) Median of Medians 选择一个近似中位数。我不明白如何使用它来选择第 k 个元素。

      【讨论】:

      • 标题要求第 k 个元素,问题要求准确的中位数。我想想象我的反馈是建设性的(尽管不如我链接到的网址那么丰富)。
      猜你喜欢
      • 2012-09-14
      • 2014-05-20
      • 2021-03-03
      • 2018-03-16
      • 2019-02-26
      • 2012-03-18
      • 2015-01-15
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多