How to check if two given sets are disjoint?
Last Updated :
23 Nov, 2023
Given two sets represented by two arrays, how to check if the given two sets are disjoint or not? It may be assumed that the given arrays have no duplicates.
Input: set1[] = {12, 34, 11, 9, 3}
set2[] = {2, 1, 3, 5}
Output: Not Disjoint
3 is common in two sets.
Input: set1[] = {12, 34, 11, 9, 3}
set2[] = {7, 2, 1, 5}
Output: Yes, Disjoint
There is no common element in two sets.
There are plenty of methods to solve this problem, it’s a good test to check how many solutions you can guess.
Method 1 (Simple): Iterate through every element of the first set and search it in another set, if any element is found, return false. If no element is found, return true. The time complexity of this method is O(mn).
Following is the implementation of the above idea.
C++
#include<bits/stdc++.h>
using namespace std;
bool areDisjoint( int set1[], int set2[], int m, int n)
{
for ( int i=0; i<m; i++)
for ( int j=0; j<n; j++)
if (set1[i] == set2[j])
return false ;
return true ;
}
int main()
{
int set1[] = {12, 34, 11, 9, 3};
int set2[] = {7, 2, 1, 5};
int m = sizeof (set1)/ sizeof (set1[0]);
int n = sizeof (set2)/ sizeof (set2[0]);
areDisjoint(set1, set2, m, n)? cout << "Yes" : cout << " No" ;
return 0;
}
|
Java
public class disjoint1
{
boolean aredisjoint( int set1[], int set2[])
{
for ( int i = 0 ; i < set1.length; i++)
{
for ( int j = 0 ; j < set2.length; j++)
{
if (set1[i] == set2[j])
return false ;
}
}
return true ;
}
public static void main(String[] args)
{
disjoint1 dis = new disjoint1();
int set1[] = { 12 , 34 , 11 , 9 , 3 };
int set2[] = { 7 , 2 , 1 , 5 };
boolean result = dis.aredisjoint(set1, set2);
if (result)
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python
def areDisjoint(set1, set2, m, n):
for i in range ( 0 , m):
for j in range ( 0 , n):
if (set1[i] = = set2[j]):
return False
return True
set1 = [ 12 , 34 , 11 , 9 , 3 ]
set2 = [ 7 , 2 , 1 , 5 ]
m = len (set1)
n = len (set2)
print ( "yes" ) if areDisjoint(set1, set2, m, n) else ( " No" )
|
C#
using System;
class GFG
{
public virtual bool aredisjoint( int [] set1,
int [] set2)
{
for ( int i = 0; i < set1.Length; i++)
{
for ( int j = 0;
j < set2.Length; j++)
{
if (set1[i] == set2[j])
{
return false ;
}
}
}
return true ;
}
public static void Main( string [] args)
{
GFG dis = new GFG();
int [] set1 = new int [] {12, 34, 11, 9, 3};
int [] set2 = new int [] {7, 2, 1, 5};
bool result = dis.aredisjoint(set1, set2);
if (result)
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
}
|
Javascript
<script>
function aredisjoint(set1,set2)
{
for (let i = 0; i < set1.length; i++)
{
for (let j = 0; j < set2.length; j++)
{
if (set1[i] == set2[j])
return false ;
}
}
return true ;
}
let set1=[12, 34, 11, 9, 3];
let set2=[7, 2, 1, 5];
result = aredisjoint(set1, set2);
if (result)
document.write( "Yes" );
else
document.write( "No" );
</script>
|
PHP
<?php
function areDisjoint( $set1 , $set2 , $m , $n )
{
for ( $i = 0; $i < $m ; $i ++)
for ( $j = 0; $j < $n ; $j ++)
if ( $set1 [ $i ] == $set2 [ $j ])
return false;
return true;
}
$set1 = array (12, 34, 11, 9, 3);
$set2 = array (7, 2, 1, 5);
$m = sizeof( $set1 );
$n = sizeof( $set2 );
if (areDisjoint( $set1 , $set2 ,
$m , $n ) == true)
echo "Yes" ;
else
echo " No" ;
?>
|
Time Complexity: O(m*n)
Auxiliary Space: O(1),As constant extra space is used.
Method 2 (Use Sorting and Merging) :
- Sort first and second sets.
- Use merge like the process to compare elements.
Following is the implementation of the above idea.
C++
#include<bits/stdc++.h>
using namespace std;
bool areDisjoint( int set1[], int set2[], int m, int n)
{
sort(set1, set1+m);
sort(set2, set2+n);
int i = 0, j = 0;
while (i < m && j < n)
{
if (set1[i] < set2[j])
i++;
else if (set2[j] < set1[i])
j++;
else
return false ;
}
return true ;
}
int main()
{
int set1[] = {12, 34, 11, 9, 3};
int set2[] = {7, 2, 1, 5};
int m = sizeof (set1)/ sizeof (set1[0]);
int n = sizeof (set2)/ sizeof (set2[0]);
areDisjoint(set1, set2, m, n)? cout << "Yes" : cout << " No" ;
return 0;
}
|
Java
import java.util.Arrays;
public class disjoint1
{
boolean aredisjoint( int set1[], int set2[])
{
int i= 0 ,j= 0 ;
Arrays.sort(set1);
Arrays.sort(set2);
while (i<set1.length && j<set2.length)
{
if (set1[i]<set2[j])
i++;
else if (set1[i]>set2[j])
j++;
else
return false ;
}
return true ;
}
public static void main(String[] args)
{
disjoint1 dis = new disjoint1();
int set1[] = { 12 , 34 , 11 , 9 , 3 };
int set2[] = { 7 , 2 , 1 , 5 };
boolean result = dis.aredisjoint(set1, set2);
if (result)
System.out.println( "YES" );
else
System.out.println( "NO" );
}
}
|
Python3
def areDisjoint(set1, set2, m, n):
set1.sort()
set2.sort()
i = 0 ; j = 0
while (i < m and j < n):
if (set1[i] < set2[j]):
i + = 1
elif (set2[j] < set1[i]):
j + = 1
else :
return False
return True
set1 = [ 12 , 34 , 11 , 9 , 3 ]
set2 = [ 7 , 2 , 1 , 5 ]
m = len (set1)
n = len (set2)
print ( "Yes" ) if areDisjoint(set1, set2, m, n) else print ( "No" )
|
C#
using System;
public class disjoint1
{
Boolean aredisjoint( int []set1, int []set2)
{
int i = 0, j = 0;
Array.Sort(set1);
Array.Sort(set2);
while (i < set1.Length && j < set2.Length)
{
if (set1[i] < set2[j])
i++;
else if (set1[i] > set2[j])
j++;
else
return false ;
}
return true ;
}
public static void Main(String[] args)
{
disjoint1 dis = new disjoint1();
int []set1 = { 12, 34, 11, 9, 3 };
int []set2 = { 7, 2, 1, 5 };
Boolean result = dis.aredisjoint(set1, set2);
if (result)
Console.WriteLine( "YES" );
else
Console.WriteLine( "NO" );
}
}
|
Javascript
<script>
function aredisjoint(set1, set2)
{
let i = 0, j = 0;
set1.sort( function (a, b){ return a - b});
set2.sort( function (a, b){ return a - b});
while (i < set1.length && j < set2.length)
{
if (set1[i] < set2[j])
i++;
else if (set1[i] > set2[j])
j++;
else
return false ;
}
return true ;
}
let set1 = [ 12, 34, 11, 9, 3 ];
let set2 = [ 7, 2, 1, 5 ];
result = aredisjoint(set1, set2);
if (result)
document.write( "YES" );
else
document.write( "NO" );
</script>
|
Time Complexity: O(m*log m + n*log n), The above solution first sorts both sets and then takes O(m+n) time to find the intersection. If we are given that the input sets are sorted, then this method is best among all.
Auxiliary Space: O(1), As constant extra space is used.
Method 3 (Use Sorting and Binary Search):
This is similar to method 1. Instead of a linear search, we use Binary Search.
- Sort first set.
- Iterate through every element of the second set, and use binary search to search every element in the first set. If an element is found return it.
Below is the implementation of the approach:
C++
#include<bits/stdc++.h>
using namespace std;
bool areDisjoint( int set1[], int set2[], int m, int n) {
sort(set1, set1+ m);
for ( int i=0; i<n; i++) {
int lb = lower_bound(set1, set1+n, set2[i]) - set1;
if (lb < n && set1[lb] == set2[i])
return false ;
}
return true ;
}
int main()
{
int set1[] = {12, 34, 11, 9, 3};
int set2[] = {7, 2, 1, 5};
int m = sizeof (set1)/ sizeof (set1[0]);
int n = sizeof (set2)/ sizeof (set2[0]);
areDisjoint(set1, set2, m, n)? cout << "Yes" : cout << " No" ;
return 0;
}
|
Java
import java.util.Arrays;
public class Main {
static boolean areDisjoint( int [] set1, int [] set2, int m, int n) {
Arrays.sort(set1);
for ( int i = 0 ; i < n; i++) {
int lb = Arrays.binarySearch(set1, set2[i]);
if (lb >= 0 )
return false ;
}
return true ;
}
public static void main(String[] args) {
int [] set1 = { 12 , 34 , 11 , 9 , 3 };
int [] set2 = { 7 , 2 , 1 , 5 };
int m = set1.length;
int n = set2.length;
System.out.println(areDisjoint(set1, set2, m, n) ? "Yes" : "No" );
}
}
|
Python3
def are_disjoint(set1, set2):
set1.sort()
for elem in set2:
index = bisect_left(set1, elem)
if index < len (set1) and set1[index] = = elem:
return False
return True
from bisect import bisect_left
if __name__ = = "__main__" :
set1 = [ 12 , 34 , 11 , 9 , 3 ]
set2 = [ 7 , 2 , 1 , 5 ]
if are_disjoint(set1, set2):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
public class GFG {
static bool AreDisjoint( int [] set1, int [] set2, int m,
int n)
{
Array.Sort(set1);
for ( int i = 0; i < n; i++) {
int lb = Array.BinarySearch(set1, set2[i]);
if (lb >= 0)
return false ;
}
return true ;
}
public static void Main( string [] args)
{
int [] set1 = { 12, 34, 11, 9, 3 };
int [] set2 = { 7, 2, 1, 5 };
int m = set1.Length;
int n = set2.Length;
Console.WriteLine(
AreDisjoint(set1, set2, m, n) ? "Yes" : "No" );
}
}
|
Javascript
function areDisjoint(set1, set2) {
set1.sort((a, b) => a - b);
for (let i = 0; i < set2.length; i++) {
let lb = lowerBound(set1, set2[i]);
if (lb < set1.length && set1[lb] === set2[i]) {
return false ;
}
}
return true ;
}
function lowerBound(arr, x) {
let low = 0, high = arr.length;
while (low < high) {
let mid = Math.floor((low + high) / 2);
if (arr[mid] < x) {
low = mid + 1;
} else {
high = mid;
}
}
return low;
}
let set1 = [12, 34, 11, 9, 3];
let set2 = [7, 2, 1, 5];
areDisjoint(set1, set2) ? console.log( "Yes" ) : console.log( "No" );
|
The time complexity of this method is O(mLogm + nLogm)
Space Complexity: O(1) as no extra space has been taken.
Method 4 (Use Binary Search Tree):
- Create a self-balancing binary search tree (Red Black, AVL, Splay, etc) of all elements in the first set.
- Iterate through all elements of the second set and search every element in the above constructed Binary Search Tree. If the element is found, return false.
- If all elements are absent, return true.
The time complexity of this method is O(m*log m + n*log m).
Method 5 (Use Hashing):
- Create an empty hash table.
- Iterate through the first set and store every element in the hash table.
- Iterate through the second set and check if any element is present in the hash table. If present, then returns false, else ignore the element.
- If all elements of the second set are not present in the hash table, return true.
The following is the implementation of this method.
C++
#include<bits/stdc++.h>
using namespace std;
bool areDisjoint( int set1[], int set2[], int n1, int n2)
{
set< int > myset;
for ( int i = 0; i < n1; i++)
myset.insert(set1[i]);
for ( int i = 0; i < n2; i++)
if (myset.find(set2[i]) != myset.end())
return false ;
return true ;
}
int main()
{
int set1[] = {10, 5, 3, 4, 6};
int set2[] = {8, 7, 9, 3};
int n1 = sizeof (set1) / sizeof (set1[0]);
int n2 = sizeof (set2) / sizeof (set2[0]);
if (areDisjoint(set1, set2, n1, n2))
cout << "Yes" ;
else
cout << "No" ;
}
|
Java
import java.util.*;
class Main
{
static boolean areDisjoint( int set1[], int set2[])
{
HashSet<Integer> set = new HashSet<>();
for ( int i= 0 ; i<set1.length; i++)
set.add(set1[i]);
for ( int i= 0 ; i<set2.length; i++)
if (set.contains(set2[i]))
return false ;
return true ;
}
public static void main (String[] args)
{
int set1[] = { 10 , 5 , 3 , 4 , 6 };
int set2[] = { 8 , 7 , 9 , 3 };
if (areDisjoint(set1, set2))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python3
def areDisjoint(set1, set2,
n1, n2):
myset = set ([])
for i in range (n1):
myset.add(set1[i])
for i in range (n2):
if (set2[i] in myset):
return False
return True
if __name__ = = "__main__" :
set1 = [ 10 , 5 , 3 , 4 , 6 ]
set2 = [ 8 , 7 , 9 , 3 ]
n1 = len (set1)
n2 = len (set2)
if (areDisjoint(set1, set2,
n1, n2)):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
using System.Collections.Generic;
public class GFG
{
public static bool areDisjoint( int [] set1, int [] set2)
{
HashSet< int > set = new HashSet< int >();
for ( int i = 0; i < set1.Length; i++)
{
set .Add(set1[i]);
}
for ( int i = 0; i < set2.Length; i++)
{
if ( set .Contains(set2[i]))
{
return false ;
}
}
return true ;
}
public static void Main( string [] args)
{
int [] set1 = new int [] {10, 5, 3, 4, 6};
int [] set2 = new int [] {8, 7, 9, 3};
if (areDisjoint(set1, set2))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
}
|
Javascript
<script>
function areDisjoint(set1,set2)
{
let set = new Set();
for (let i = 0; i < set1.length; i++)
set.add(set1[i]);
for (let i = 0; i < set2.length; i++)
if (set.has(set2[i]))
return false ;
return true ;
}
let set1 = [10, 5, 3, 4, 6];
let set2 = [8, 7, 9, 3];
if (areDisjoint(set1, set2))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(m+n) under the assumption that hash set operations like add() and contains() work in O(1) time.
Auxiliary Space: O(n), The extra space is used to store the elements in the set.
Method 6: Using inbuilt function
C++
#include <iostream>
#include <unordered_set>
using namespace std;
bool areDisjoint( int arr1[], int n1, int arr2[], int n2)
{
unordered_set< int > set1(arr1, arr1 + n1);
unordered_set< int > set2(arr2, arr2 + n2);
unordered_set< int > result;
for ( int x : set1) {
if (set2.find(x) != set2.end()) {
result.insert(x);
}
}
if (result.size() != 0) {
return false ;
}
else {
return true ;
}
}
int main()
{
int arr1[] = { 10, 5, 3, 4, 6 };
int n1 = sizeof (arr1) / sizeof (arr1[0]);
int arr2[] = { 8, 7, 9, 3 };
int n2 = sizeof (arr2) / sizeof (arr2[0]);
if (areDisjoint(arr1, n1, arr2, n2)) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
return 0;
}
|
Java
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class DisjointArrays {
public static boolean areDisjoint( int [] arr1, int n1,
int [] arr2, int n2)
{
Set<Integer> set1 = new HashSet<Integer>();
for ( int i = 0 ; i < n1; i++) {
set1.add(arr1[i]);
}
Set<Integer> set2 = new HashSet<Integer>();
for ( int i = 0 ; i < n2; i++) {
set2.add(arr2[i]);
}
Set<Integer> result = new HashSet<Integer>();
for ( int x : set1) {
if (set2.contains(x)) {
result.add(x);
}
}
if (!result.isEmpty()) {
return false ;
}
else {
return true ;
}
}
public static void main(String[] args)
{
int [] arr1 = { 10 , 5 , 3 , 4 , 6 };
int n1 = arr1.length;
int [] arr2 = { 8 , 7 , 9 , 3 };
int n2 = arr2.length;
if (areDisjoint(arr1, n1, arr2, n2)) {
System.out.println( "YES" );
}
else {
System.out.println( "NO" );
}
}
}
|
Python3
def areDisjoint(arr1, arr2):
set1 = set (arr1)
set2 = set (arr2)
result = set1.intersection(set2)
if len (result) ! = 0 :
return False
else :
return True
arr1 = [ 10 , 5 , 3 , 4 , 6 ]
arr2 = [ 8 , 7 , 9 , 3 ]
if areDisjoint(arr1, arr2):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
using System.Collections.Generic;
class Program {
static bool AreDisjoint( int [] arr1, int [] arr2) {
HashSet< int > set1 = new HashSet< int >(arr1);
HashSet< int > set2 = new HashSet< int >(arr2);
HashSet< int > result = new HashSet< int >();
foreach ( int x in set1) {
if (set2.Contains(x)) {
result.Add(x);
}
}
return result.Count == 0;
}
static void Main( string [] args) {
int [] arr1 = { 10, 5, 3, 4, 6 };
int [] arr2 = { 8, 7, 9, 3 };
if (AreDisjoint(arr1, arr2)) {
Console.WriteLine( "YES" );
}
else {
Console.WriteLine( "NO" );
}
}
}
|
Javascript
function areDisjoint(arr1, n1, arr2, n2) {
let set1 = new Set(arr1);
let set2 = new Set(arr2);
for (let x of set1) {
if (set2.has(x)) {
return false ;
}
}
return true ;
}
let arr1 = [10, 5, 3, 4, 6];
let n1 = arr1.length;
let arr2 = [8, 7, 9, 3];
let n2 = arr2.length;
if (areDisjoint(arr1,n1,arr2,n2)) {
console.log( "YES" );
} else {
console.log( "NO" );
}
|
Time Complexity: O(min(n, m)), where n = length of arr1, m = length of arr2
Auxiliary Space: O(max(n, m))
Please Login to comment...