三集不相交问题

算法分析:
我们给出三个无重复元素的序列A,B,C,长度都为n,但是在不同序列中的元素可以重复,三集不相交问题就是确定三个序列的交集是否为空,即是否存在元素x满足x∈A,x∈B,同时x属于C

public static boolean noIntersect_v1(int[] arrA,int[] arrB,int[] arrC){
    
    
        for (int i = 0; i < arrA.length; i++) {
    
      //1
            for (int j = 0; j < arrB.length; j++) {
    
      //2
                for (int k = 0; k < arrC.length; k++) {
    
      //3
                    if (arrA[i] == arrB[j] && arrA[i] == arrC[k] && arrB[j] == arrC[k]){
    
    
                        return false;
                    }
                }
            }
        }
        return true;
    }

noIntersect_v1(),这个简单的算法将遍历三个序列任一组可能相等的三个值,假如最初每个序列的长度都为n,那么在最坏的情况下遍历全部,运行时间取最高次幂将为O(n^3)
针对以上算法我们还可以利用一个判断来提高渐进性,在循环B中发现序列A[ i ]和B[ j ]元素不相等,我们将停止对序列C的遍历。

public static boolean noIntersect_v2(int[] arrA,int[] arrB,int[] arrC){
    
    
        for (int i = 0; i < arrA.length; i++) {
    
    
            for (int j = 0; j < arrB.length; j++) {
    
    
                if (arrA[i]== arrB[j]){
    
      //先判断
                    for (int k = 0; k < arrC.length; k++) {
    
    
                        if (arrB[j] == arrC[k]){
    
    
                            return false;
                        }
                    }
                }
            }
        }
        return true;
    }

在改进的算法noIntersect_v2()中,为了计算总的运行时间,我们检验每一行代码,for循环在A上面的运行时间为O(n),在B上面需要的时间为O(n²),因为该循环被执行在n的不同时间段,预计在A[ i ] == B[ j ]上的运行时间为O(n²),剩下的运行时间取决于会有多少对A中和B中相等的值,我们可以发现每个序列的长度都为n,也最多有n对相等的值,因此for循环在C上的以及循环内的时间最多为(n²),所有总的运行时间为O(n²)。

猜你喜欢

转载自blog.csdn.net/qq_44976729/article/details/109104257