4个排序数组的中值算法

时间:2019-03-21 22:58:48

标签: java algorithm median

我需要为自己的课程编写一个算法,以找到O(n)中大小不同的4个排序数组的中间值,并且不允许我创建一个数组来存储数据。 我应该如何解决这个问题?我考虑过在具有4个索引的循环上运行,就好像我将数组排序成一个大数组一样,但是只是在不存储数据的情况下运行。循环将在n / 2处停止,它应该为我提供中间值。 编写它看起来很复杂而且很混乱(如果我超出范围,我需要检查4个数组),有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

我认为您已经掌握了关键思想:四个数组中所有值的中值只是所有值的中值,因此,如果我们对所有值进行一半运算,那么下一个是中值。我建议结构如下:

int firstIndex = 0;
int secondIndex = 0;
int thirdIndex = 0;
int fourthIndex = 0;
double current;

for (int i = 0; i < n/2; i++) {
    // 1.) Find the value out of the four at firstIndex, secondIndex, ...
    //     which is smallest, and assign it to current
    // 2.) Increment whichever of the four indices belongs to that element
}
// whatever is in current at the end of the loop is the middle element

您可能想要一个函数findMin(int index1, int index2, int index3, int index4)。此方法还可能负责越界检查,因此主循环可以仅依靠它指向正确的方向,而不必关心它是否耗尽了给定数组中的任何元素。

这有意义吗?我已经尽力让您处理大多数实际的实现工作了:)

答案 1 :(得分:0)

考虑单个未排序的数组

考虑将4个数组视为单个 unsorted 数组,分为4个部分。如果可以修改数组,则可以通过在它们之间交换值来对所有4个数组进行排序,就好像对1个数组进行排序(可以进行一些优化,因为您知道对4个数组进行了排序)。对数组进行最多n / 2个排序(其中n是4个数组的总长度)后,只需返回所有4个数组的中间值即可。

某些代码

下面的实现开始使多个数组像单个数组一样起作用。我已经实现了getsetlength方法,它们是任何数组的基础。现在需要做的就是使用get(int)set(int,int)length()对类的数据进行排序(可能最多n / 2),并返回一个中位数值median()

通过在中位数方法中最多排序n / 2个,以及在这样做时为每个元素缓存(i,j)对时,还有进一步优化的空间。

int median( int[] a1, int[] a2, int[] a3, int[] a4 ) {
    MultiIntArray array = new MultiIntArray( a1, a2, a3, a4 );
    array.sort();
    return array.get( array.length() / 2 );
}
public class MultiIntArray {

    private int[][] data;

    public MultiIntArray( int[]... data ) {
        this.data = data;
    }

    public void sort() {
        // FOR YOU TO IMPLEMENT
    }

    public int length() {
        int length = 0;
        for ( int[] array : data ) {
            length += array.length;
        }
        return length;
    }

    public int get( int index ) {
        int i = 0;
        while ( index >= data[i].length ) {
            index -= data[i].length;
            i += 1;
        }
        return data[i][index];
    }

    public void set( int index, int value ) {
        int i = 0;
        while ( index >= data[i].length ) {
            index -= data[i].length;
            i += 1;
        }
        data[i][index] = value;
    }

}