我正在尝试将算法降低到可能的最低运行时间。
该算法的运行时间是多少;因为for循环,它是O(log n)还是O(n log n)?
import java.util.Arrays;
public class countDifferenceBetweenTwoArrays {
private static int countDifference(int[] arrayA, int[] arrayB) {
int differenceCount = 0;
for (Integer i : arrayA) {
if (Arrays.binarySearch(arrayB, i) < 0) {
differenceCount++;
}
}
for (Integer i : arrayA) {
if (Arrays.binarySearch(arrayB, i) < 0) {
differenceCount++;
}
}
return differenceCount;
}
答案 0 :(得分:1)
您的实现是O(nlog(n))。迭代每个数组,操作为O(n)。在每次迭代中,执行O(log(n))二进制搜索操作。这为您提供了处理每个数组的O(nlog(n))运行时间。你这样做了两次,但我们忽略了常数因子2,给我们留下了整个函数的O(nlog(n))。
答案 1 :(得分:1)
您需要在集合之间取symmetric difference以获取每个集中的唯一元素。在Java中,这是通过Set#removeAll
完成的。
private static int distinctNumberOfItems(int[] arrayA, int[] arrayB) {
HashSet<Integer> setA = new HashSet<Integer>();
HashSet<Integer> setB = new HashSet<Integer>();
HashSet<Integer> setC = new HashSet<Integer>();
for (int i : arrayA) {
setA.add(i);
setC.add(i);
}
for (int i : arrayB) {
setB.add(i);
}
setA.removeAll(setB);
setB.removeAll(setC);
return setA.size() + setB.size();
}
答案 2 :(得分:0)
用于检查整数之间冲突的哈希表。
返回两个数组中不同整数的数量
private static int distinctNumberOfItems(int[] arrayA, int[] arrayB) {
HashSet<Integer> setA = new HashSet<Integer>();
HashSet<Integer> setB = new HashSet<Integer>();
for (int i : arrayA) {
setA.add(i);
setB.add(i);
}
for (int i : arrayB) {
setB.add(i);
if (setA.contains(i))
setB.remove(i);
}
System.out.println(setB);
return setB.size();
}
}