簡體   English   中英

Java:取2個數組查找是否存在於兩個數組中的元素如果存在則返回true否則為false

[英]Java : Taking 2 array find if the element that exists in both array return true if exist else false

我正在尋找有關此解決方案的一些說明。 誰能指導我以下兩點:

  1. 下面的算法是好的解決方案嗎?
  2. 我的 Big 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)

你的第二個解決方案也是 O(N^2),因為包含在引擎蓋下工作 O(N)。

第一個解決方案 O(N*LogN):

  1. 對第二個數組進行排序。 對數
  2. 遍歷第一個 O(N) 並通過第二個 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;
  1. 我認為這兩種算法看起來都很合理。
  2. ArrayList.contains 的時間復雜度是 O(n)。

size、isEmpty、get、set、iterator 和 listIterator 操作在恆定時間內運行。 add 操作在分攤常數時間內運行,即添加 n 個元素需要 O(n) 時間。 所有其他操作都在線性時間內運行(粗略地說)。 與 LinkedList 實現相比,常量因子較低。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM