用于for循环的二进制搜索算法的大O?

时间:2016-02-17 03:13:23

标签: java big-o time-complexity binary-search

我正在尝试将算法降低到可能的最低运行时间。

该算法的运行时间是多少;因为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;
  }

3 个答案:

答案 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();
  }
}