一位调查员问我下面的问题:
从十亿条记录的排序数组中搜索出唯一的整数值(约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的情况下实现相同的方法?
答案 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);
}