算法分析:
我们给出三个无重复元素的序列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²)。