Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从具有复杂性的排序数组中查找唯一元素<;O(n)_Java_Arrays_Algorithm_Sorting_Collections - Fatal编程技术网

Java 从具有复杂性的排序数组中查找唯一元素<;O(n)

Java 从具有复杂性的排序数组中查找唯一元素<;O(n),java,arrays,algorithm,sorting,collections,Java,Arrays,Algorithm,Sorting,Collections,一位采访者问我以下问题: 从十亿条记录(如1,1,1,1,3,3,4,5,5,6,6,6,6,7,7,7,7,8,8,8………)的排序数组中搜索唯一整数值(约1000),其复杂性小于O(n)。 注意:不要使用SET 我尝试实施的一个解决方案: 将该数组分成两组数组,然后迭代这两个子数组,如果元素不存在,则在hashmap中搜索,然后将其添加到hashmap中,否则将移动到下一次迭代 public static void main(String[] args) { int arr[] =

一位采访者问我以下问题:

从十亿条记录(如1,1,1,1,3,3,4,5,5,6,6,6,6,7,7,7,7,8,8,8………)的排序数组中搜索唯一整数值(约1000),其复杂性小于O(n)。
注意:不要使用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());

}
publicstaticvoidmain(字符串[]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=newHashMap();
System.out.println(“数组长度:“+arr.length”);
如果((arr.length)%2==0){
size1=size2=arr.length/2;
}否则{
尺寸1=(arr.length+1)/2;
size2=(arr.length)/2;
}

对于(int i=0;((size1-i-1)>=0)| |((size2+i)我会尝试一种基于二进制搜索的方法,从中间的元素开始——如果它与其中一条边相同,那么你可以使用数组被排序的事实,并消除这一半。如果它与边上的每一条不同,则将数组分成两半,然后递归地处理每一条边

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

范例-

1 1 1 1 1 2 2 2 2

可以通过两个步骤完成。为什么不使用集合而不是映射。无论如何,集合不允许重复元素

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);
}
publicstaticvoidmain(字符串[]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 aset=newhashset();
System.out.println(“数组长度:“+arr.length”);
用于(int i:arr){
aset.添加(i);
}
系统输出打印LN(aset);
}

你想要数组中所有唯一的值吗?这意味着你必须至少访问每个元素一次,这意味着无论你做什么,它都不能比O(n)快。而且,O(n/n)没有任何意义。那只是O(1)。你在哪里采访过?几天前有人问过同样的问题:当然,它仍然是O(n)-正如David所说,这是必须的。你在n/k次迭代中循环,但每次迭代都要进行两次k次比较。这只是循环展开。我希望面试官关于n个细分的问题能够引导你认识到这不起作用。@vz0:这应该是一个答案,或者应该作为一个副本结束.可能是后者。