使用O(1)空间在四个(单独)排序的数组中查找中位数

时间:2019-03-17 14:36:34

标签: arrays algorithm median

我分配了一个任务,以便在4个单独排序的数组中找到一个中位数。

中位数被定义为位于数组中间(在下标(N / 2)处)的元素

要求:

  1. 时间复杂度:与组合数组的大小成线性关系
  2. 空间复杂度:O(1)

我知道如何在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);

预先感谢

2 个答案:

答案 0 :(得分:1)

考虑单个未排序的数组

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

某些代码

下面的实现开始使多个数组像单个数组一样起作用。我已经实现了getsetlength方法,它们是任何数组的基础。现在需要做的就是使用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次四个数组中最小的第一个元素即可。不需要聪明的算法。

我相信您可以更快地完成它。