Java 4个排序数组的中值算法

Java 4个排序数组的中值算法,java,algorithm,median,Java,Algorithm,Median,我需要为我的课程编写一个算法,在O(n)中找到4个不同大小的排序数组的中间值,我不允许创建一个数组来存储数据。 我应该如何处理这个问题?我考虑在一个有4个索引的循环上运行,就像我在将数组排序为一个大数组一样,但只是在不存储数据的情况下运行。循环将在n/2处停止,它应该为我提供中间值。 写它似乎很复杂,也很混乱(如果我超出了范围,我需要检查其中的4个数组),有没有更好的方法来解决这个问题?我想你已经了解了关键思想:四个数组中所有值的中值就是所有值的中值,所以如果我们把所有的值都取一半,那么接下来的

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

我想你已经了解了关键思想:四个数组中所有值的中值就是所有值的中值,所以如果我们把所有的值都取一半,那么接下来的就是中值。我建议结构如下:

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
int firstIndex=0;
int secondIndex=0;
int-thirdIndex=0;
int-fourthIndex=0;
双电流;
对于(int i=0;i
您可能需要一个函数
findMin(int index1、int index2、int index3、int index4)
。这个方法也可以负责越界检查,因此主循环可以依赖它来指向正确的方向,而不关心它是否在任何给定数组中用完了元素


这有意义吗?我试图留下足够的模糊性,让您能够处理大部分实际的实现工作:)

想想单个未排序的数组

考虑将4个数组看作一个未排序的数组,分成4个部分。如果可以修改数组,则可以通过在所有4个数组之间交换值对它们进行排序,就像对1一样(因为您知道4个数组已排序,所以可以进行一些优化)。将数组排序到n/2(其中n是4个数组的聚合长度)后,只需返回所有4个数组的中间值

一些代码

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

通过在中值方法中仅排序到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 );
}

链接问题可能重复,但未明确提及不同尺寸的
。到目前为止,它还没有有用的答案。我已经弄明白了这一点。。问题是findMin不能负责越界检查,因为您需要将数组也提供给它,或者至少提供数组长度。第二个问题是,如果您在找到最小值并将其发送回后生成一个findMin函数,那么您将如何知道哪个索引给出了该数字。你需要一个全局索引,但这是禁止的。“你也需要给它数组”是的,或者让数组成为
findMin()
可以访问的状态的一部分(即全局变量)。“你怎么知道哪个索引给了你这个数字”既然你在跟踪
firstIndex
secondIndex
等等,为什么
findMin()
要返回最小值呢?
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;
    }

}