【问题标题】:Java : Taking 2 array find if the element that exists in both array return true if exist else falseJava:取2个数组查找两个数组中都存在的元素,如果存在则返回true,否则返回false
【发布时间】:2019-12-04 10:55:11
【问题描述】:

我正在寻找有关此解决方案的一些说明。谁能指导我以下两点:

  1. 下面的算法是好的解决方案吗?
  2. 我的大 O 计算是否正确?

非常感谢您的澄清。在此先感谢

public static void main(String[] args) {
    String[] a = {"a", "b", "c", "d"};
    String[] b = {"z", "f", "c"};

    boolean value1 = find(a, b);
    System.out.println(value1);

    boolean value2 = findArray(a, b);
    System.out.println(value2);

}

/*
since the both the array is of diff size for nested loop
Big O  = O(n*n)
if array size is same Big O = O(n^2)
 */
private static boolean find(String[] a, String[] b) {
    for (int i = 0; i < a.length; i++) {
        String val1 = a[i];
        for (int j = 0; j < b.length; j++) {
            if (val1.equals(b[j])) {
                System.out.println(val1 + " : " + b[j]);

                return true;
            }
        }// O(n)
    }// O(n)
    return false;
}// O(n*n)

/*
Big O  = O(n)
 */
private static boolean findArray(String[] a, String[] b) {
    //create array list from array
    List<String> list = new ArrayList<>(Arrays.asList(b));
    for (int i = 0; i < a.length; i++) {
        String val1 = a[i]; //O(1)

        if (list.contains(val1)) {
            System.out.println(val1 + " : contain in list b");
            return true;
        }// O(1)

    }// O(n)
    return false;
}// O(n)

【问题讨论】:

标签: java arrays algorithm


【解决方案1】:

您的第二个解决方案也是 O(N^2),因为在引擎盖下包含工作 O(N)。

第一个解 O(N*LogN):

  1. 对第二个数组进行排序。 NLogN
  2. 遍历第一个 O(N) 和 binary search 通过第二个 一个 O(logN) => O(NLogN)

总体复杂度 O(NLogN)

第二种解决方案 O(N) - 如果数组已排序。如果不是 O(NLogN),因为第 1 步

  1. 对两个数组排序 O(NlogN)
  2. 做这样的事情

代码:

int curA = 0, curB = 0;
while (true) {
 if (curA >= a.length || curB >= b.length)
  break;
 if (a[curA] < b[curB]) {
  curA++;
  continue;
 }

 if (a[curA] > b[curB]) {
  curB++;
  continue;
 }

 return true;
}
return false;

【讨论】:

    【解决方案2】:
    1. 我认为这两种算法看起来都很合理。
    2. ArrayList.contains 时间复杂度为 O(n)。

    size、isEmpty、get、set、iterator 和 listIterator 操作在恒定时间内运行。添加操作在摊销常数时间内运行,即添加 n 个元素需要 O(n) 时间。 所有其他操作都以线性时间运行(粗略地说)。与 LinkedList 实现相比,常数因子较低。

    https://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

    【讨论】:

    • 感谢您的回答。在时间复杂度方面有没有更好的方法来解决这个问题。
    • 很高兴为您提供帮助!我想不出比@mondayguy 建议的更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多