我分配了一个任务,以便在4个单独排序的数组中找到一个中位数。
中位数被定义为位于数组中间(在下标(N / 2)处)的元素
要求:
我知道如何在2个具有O(1)空间和O(logn)时间的排序数组中找到一个中值,但是我找不到4个满足O(1)空间要求的数组的好解决方案。
我尝试为3个数组调整算法,但对我来说效果不佳。
我的作业示例:
L.Control.Layers.NeverDisable = L.Control.Layers.extend({
_checkDisabledLayers: function(){}
});
var myLayersControl = new L.Control.Layers.NeverDisable(
baselayers, overlayLayers, options);
myLayersControl.addTo(map);
预先感谢
答案 0 :(得分:1)
考虑单个未排序的数组
考虑将4个数组视为单个 unsorted 数组,分为4个部分。如果可以修改数组,则可以通过在它们之间交换值来对所有4个数组进行排序,就好像对1个数组进行排序(可以进行一些优化,因为您知道对4个数组进行了排序)。对数组进行最多n / 2个排序(其中n是4个数组的总长度)后,只需返回所有4个数组的中间值即可。
某些代码
下面的实现开始使多个数组像单个数组一样起作用。我已经实现了get
,set
和length
方法,它们是任何数组的基础。现在需要做的就是使用get(int)
,set(int,int)
和length()
对类的数据进行排序(可能最多n / 2),并返回一个中位数值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;
}
}
答案 1 :(得分:0)
使用“时间复杂度是组合数组的大小”这一限制是微不足道的,您只需选择n / 2次四个数组中最小的第一个元素即可。不需要聪明的算法。
我相信您可以更快地完成它。