检查一个阵列是否是另一个阵列的置换版本

时间:2016-06-02 14:57:47

标签: java

我想检查数组B是否是数组A的排列。

我认为可以使用1 for - 循环完成,但我看到不同的来源,大多数人告诉我使用2 for - 循环。

for (int i = 0; i < A.length; i++) {
    boolean found = false;
    for (int j = 0; j < B.length; j++)
        if (B[j] == A[i]) { 
            found = true;
            break; 
        }
        assert(found);
    }
    for (int i = 0; i < B.length; i++) {
        boolean found = false;
        for (int j = 0; j < A.length; j++)
            if (A[j] == B[i]) { 
                found = true; 
                break; 
            }
        assert(found);
    }

这是一个正确的实现2 for - 循环吗?

顺便说一句,为什么我必须执行2 for - 循环,其中第一个是比较B和A,然后是第二个A和B?

1 个答案:

答案 0 :(得分:2)

您的代码将排列检查分为两个操作:

  1. 为每个元素A[i]检查A[i]
  2. 中是否显示B
  3. 为每个元素B[j]检查B[j]
  4. 中是否显示A

    如@Tom所述,这在一般情况下不起作用,因为它忽略了重复的元素。

    效率也很低。如果在其他任何事情之前检查A.length == B.length,则第二部分可以省略,但其余部分仍为O(n²)。它仍然是错误的,因为它在考虑重复元素时会返回误报。

    - 更多或更少 - 规范方法是简单地对两个数组进行排序并将它们进行相等性比较:

    Arrays.sort(A);
    Arrays.sort(B);
    assert(Arrays.equals(A, B));
    

    排序通常知道为O(n ln n),因此整个操作现在比以前更有效。它还使事情更具可读性。