# Multiset Equivalence Problem

Unlike a set, a multiset may contain multiple occurrences of same number. The multiset equivalence problem states to check if two given multisets are equal or not. For example let A = {1, 2, 3} and B = {1, 1, 2, 3}. Here A is set but B is not (1 occurs twice in B), whereas A and B are both multisets. More formally, “Are the sets of pairs defined as equal for the two given multisets?”

Given two multisets A and B, write a program to check if the two multisets are equal.

Note: Elements in the multisets can be of order 109

Examples:

Input : A = {1, 1, 3, 4},
B = {1, 1, 3, 4}
Output : Yes

Input : A = {1, 3},
B = {1, 1}
Output : No


## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Since the elements are as large as 10^9 we cannot use direct index table.

One solution is to sort both multisets and compare them one by one.

 // C++ program to check if two given multisets  // are equivalent  #include  using namespace std;     bool areSame(vector<int>& a, vector<int>& b)  {      // sort the elements of both multisets      sort(a.begin(), a.end());      sort(b.begin(), b.end());         // Return true if both multisets are same.      return (a == b);  }     int main()  {      vector<int> a({ 7, 7, 5 }), b({ 7, 5, 5 });      if (areSame(a, b))          cout << "Yes\n";      else         cout << "No\n";      return 0;  }

 // Java program to check if two given multisets   // are equivalent   import java.util.*;  class GFG {        static boolean areSame(Vectora, Vectorb)   {       // sort the elements of both multisets       Collections.sort(a);       Collections.sort(b);          // Return true if both multisets are same.       return (a == b);   }    public static void main(String[] args) {         Vector a = new Vector(Arrays.asList( 7, 7, 5 ));         Vector b = new Vector(Arrays.asList( 7, 5, 5));      if (areSame(a, b))           System.out.print("Yes\n");       else         System.out.print("No\n");      }  }  // This code is contributed by PrinciRaj1992

 # Python3 program to check if   # two given multisets are equivalent     def areSame(a, b):             # sort the elements of both multisets      a.sort();      b.sort();         # Return true if both multisets are same.      return (a == b);     # Driver Code  a = [ 7, 7, 5 ];  b = [ 7, 5, 5 ];  if (areSame(a, b)):      print("Yes");  else:      print("No");     # This code is contributed by Princi Singh

 // C# program to check if two given multisets   // are equivalent   using System;  using System.Collections.Generic;     class GFG  {     static bool areSame(List<int>a, List<int>b)   {       // sort the elements of both multisets       a.Sort();      b.Sort();         // Return true if both multisets are same.       return (a == b);   }      // Driver code  public static void Main()  {      List<int> a = new List<int> { 7, 7, 5 };      List<int> b = new List<int> { 7, 5, 5 };      if (areSame(a, b))           Console.WriteLine("Yes\n");       else         Console.WriteLine("No\n");  }  }     // This code is contributed by Rajput-Ji

Output:
No


A better solution is to use hashing. We create two empty hash tables (implemented using unordered_map in C++). We first insert all items of first multimap in first table and all items of second multiset in second table. Now we check if both hash tables contain same items and frequencies or not.

 // C++ program to check if two given multisets  // are equivalent  #include  using namespace std;     bool areSame(vector<int>& a, vector<int>& b)  {      if (a.size() != b.size())          return false;         // Create two unordered maps m1 and m2      // and insert values of both vectors.      unordered_map<int, int> m1, m2;      for (int i = 0; i < a.size(); i++) {          m1[a[i]]++;          m2[b[i]]++;      }         // Now we check if both unordered_maps      // are same of not.      for (auto x : m1) {          if (m2.find(x.first) == m2.end() ||               m2[x.first] != x.second)              return false;      }         return true;  }     // Driver code  int main()  {      vector<int> a({ 7, 7, 5 }), b({ 7, 7, 5 });      if (areSame(a, b))          cout << "Yes\n";      else         cout << "No\n";      return 0;  }

 // Java program to check if two given multisets  // are equivalent  import java.util.*;     class GFG   {  static boolean areSame(int []a, int []b)  {      if (a.length != b.length)          return false;         // Create two unordered maps m1 and m2      // and insert values of both vectors.      HashMap m1, m2;      m1 = new HashMap();      m2 = new HashMap();      for (int i = 0; i < a.length; i++)      {          if(m1.containsKey(a[i]))          {              m1.put(a[i], m1.get(a[i]) + 1);          }          else         {              m1.put(a[i], 1);          }          if(m2.containsKey(b[i]))          {              m2.put(b[i], m2.get(b[i]) + 1);          }          else         {              m2.put(b[i], 1);          }      }         // Now we check if both unordered_maps      // are same of not.      for (Map.Entry x : m1.entrySet())      {          if (!m2.containsKey(x.getKey()) ||                m2.get(x.getKey()) != x.getValue())              return false;      }      return true;  }     // Driver code  public static void main(String args[])   {      int []a = { 7, 7, 5 };      int []b = { 7, 7, 5 };      if (areSame(a, b))          System.out.println("Yes");      else         System.out.println("No");  }  }     // This code is contributed by 29AjayKumar

 // C# program to check if two given multisets  // are equivalent   using System;  using System.Collections.Generic;     class GFG   {  static bool areSame(int []a, int []b)  {      if (a.Length != b.Length)          return false;         // Create two unordered maps m1 and m2      // and insert values of both vectors.      Dictionary<int, int> m1, m2;      m1 = new Dictionary<int, int>();      m2 = new Dictionary<int, int>();      for (int i = 0; i < a.Length; i++)      {          if(m1.ContainsKey(a[i]))          {              m1[a[i]] = m1[a[i]] + 1;          }          else         {              m1.Add(a[i], 1);          }          if(m2.ContainsKey(b[i]))          {              m2[b[i]] = m2[b[i]] + 1;          }          else         {              m2.Add(b[i], 1);          }      }         // Now we check if both unordered_maps      // are same of not.      foreach(KeyValuePair<int, int> x in m1)      {          if (!m2.ContainsKey(x.Key) ||                m2[x.Key] != x.Value)              return false;      }      return true;  }     // Driver code  public static void Main(String []args)   {      int []a = { 7, 7, 5 };      int []b = { 7, 7, 5 };      if (areSame(a, b))          Console.WriteLine("Yes");      else         Console.WriteLine("No");  }  }     // This code is contributed by 29AjayKumar

Output:
Yes


Time complexity : O(n) under the assumption that unordered_map find() and insert() operations work in O(1) time.

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :