Подумайте об одном несортированном массиве
Рассмотрим 4 массива как один несортированный массив, разбитый на 4 части. Если вы можете изменить массивы, вы можете отсортировать все 4 массива, как если бы 1, поменяв местами значения между ними (можно провести некоторую оптимизацию, поскольку вы знаете, что 4 массива отсортированы). После того, как вы отсортировали массивы до n / 2 (где n - общая длина 4 массивов), просто верните среднее значение всех 4.
Какой-то код
Приведенная ниже реализация начинает делать несколько массивов функционирующими как один. Я реализовал get
, set
и length
методы, основу для любого массива. Все, что должно произойти сейчас, - это сортировка данных класса (возможно, до n / 2) с использованием get(int)
, set(int,int)
и length()
, а также метод, который возвращает медианное значение median()
.
Возможно, есть способ получить медианное значение массива за один проход, однако я не могу об этом думать. Быстрая сортировка и поиск будут выполнять в O (nLogn) сложность времени, только один проход уменьшит это до O (n) (линейный к размеру массива).
Существует также место для дальнейшей оптимизации путем сортировки только до 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;
}
}