从排序数组中找到具有复杂度的独特元素<上)

时间:2014-11-18 13:32:48

标签: java arrays algorithm sorting collections

一位调查员问我下面的问题:

从十亿条记录的排序数组中搜索出唯一的整数值(约1000)(如1,1,1,1,3,3,3,4,5,5,6,6,6,6,复杂度小于O(n)的6,7,7,7,7,7,7,8,8,8,8 ............ 注意:不要使用SET。

我试图实施的一个解决方案:

将该数组划分为两组数组,然后迭代两个子数组并在hashmap中搜索,如果元素不退出,则将其添加到hashmap中,否则转移到下一次迭代。

public static void main(String[] args) {
    int arr[] = {1,2,4,9,-3,5,6,3,6,12,5,6,2,-1,-3,6,87,9,2,3,5,7,9,1,0,1,3,5,7,6,3,8,6,3,21,45,6};
    int size1 =0, size2 = 0;
    HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();
    System.out.println("length of Array:"+arr.length);

    if((arr.length)%2 == 0){
        size1 = size2 = arr.length/2;
    }else{
        size1 = (arr.length + 1)/2;
        size2 = (arr.length)/2;
    }

    for(int i=0;((size1-i-1)>= 0)||((size2+i)<(arr.length - 1));i++){
        if(map.containsKey(arr[size1 -i-1])== false){
            map.put(arr[size1 -i-1],arr[size1 -i-1]);
        }
        if(map.containsKey(arr[size2 + i]) == false){
            map.put(arr[size2 + i], arr[size2 + i]);
        }
    }

    System.out.println(map.keySet());

}

它按预期工作,然后他问我们如何将数组分成n组?

那么复杂性是O(1)还是O(n / n)?有可能吗?

请建议是否有其他方法可以在不使用hashmap的情况下实现相同的方法?

2 个答案:

答案 0 :(得分:0)

我尝试基于二进制搜索的方法,从中间元素开始 - 如果它与其中一个边相同,那么你可以使用数组排序的事实并消除那一半。如果它与边缘上的每个不同 - 将数组分成两半并递归地继续每个数组。

在最坏的情况下,这仍然是O(n),但平均而言,它可能比通过整个阵列更好(特别是如果有很多重复)

示例 -

1 1 1 1 1 2 2 2 2

可以分两步完成

答案 1 :(得分:0)

为什么不使用Set代替Map。无论如何,Set不允许重复元素。

public static void main(String[] args) {
    int arr[] = { 1, 2, 4, 9, -3, 5, 6, 3, 6, 12, 5, 6, 2, -1, -3, 6, 87,
            9, 2, 3, 5, 7, 9, 1, 0, 1, 3, 5, 7, 6, 3, 8, 6, 3, 21, 45, 6 };

    Set<Integer> aset = new HashSet<Integer>();

    System.out.println("length of Array:" + arr.length);

    for (int i : arr) {
        aset.add(i);
    }
    System.out.println(aset);
}