Multiset Equivalence Problem

23 Jun, 2022
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 109Examples:  
Input : A = {1, 1, 3, 4},  
        B = {1, 1, 3, 4}
Output : Yes

Input : A = {1, 3},  
        B = {1, 1}
Output : No
 
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++
Java
Python3
C#
Javascript
// C++ program to check if two given multisets// are equivalent#include <bits/stdc++.h>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 equivalentimport java.util.*;class GFG {  static boolean areSame(Vector<Integer>a, Vector<Integer>b){    // 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<Integer> a = new Vector<Integer>(Arrays.asList( 7, 7, 5 ));       Vector<Integer> b = new Vector<Integer>(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 Codea = [ 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 equivalentusing 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 codepublic 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
<script> // JavaScript program to check if two given multisets// are equivalent  function areSame(a, b) {    // sort the elements of both multisets    a.sort((a, b) => a - b);    b.sort((a, b) => a - b);     // Return true if both multisets are same.    return (a == b);}  let a = [7, 7, 5], b = [7, 5, 5];if (areSame(a, b))    document.write("Yes<br>");else    document.write("No<br>");     </script>
No
 
Time Complexity: O(n*log(n))Auxiliary Space: O(1)
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++
Java
Python3
C#
Javascript
// C++ program to check if two given multisets// are equivalent#include <bits/stdc++.h>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 codeint 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 equivalentimport 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<Integer, Integer> m1, m2;    m1 = new HashMap<Integer, Integer>();    m2 = new HashMap<Integer, Integer>();    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<Integer, Integer> x : m1.entrySet())    {        if (!m2.containsKey(x.getKey()) ||             m2.get(x.getKey()) != x.getValue())            return false;    }    return true;} // Driver codepublic 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
# Python program to check if two given multisets# are equivalentdef areSame(a, b):    if (len(a) != len(b)):        return False     # Create two unordered maps m1 and m2    # and insert values of both vectors.    m1 = {}    m2 = {}     for i in range(len(a)):        if (a[i] in m1):            m1[a[i]] = m1[a[i]] + 1        else:            m1[a[i]] = 1         if (b[i] in m2):            m2[b[i]] = m2[b[i]] + 1        else:            m2[b[i]] = 1     # Now we check if both unordered_maps    # are same of not.    for k in m1.keys():        if (k not in m1 or m2[k] != m1[k]):            return False     return True  # Driver codea = [7, 7, 5]b = [7, 7, 5]if (areSame(a, b)):    print("Yes")else:    print("No") # This code is contributed by Saurabh Jaiswal
// C# program to check if two given multisets// are equivalentusing 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 codepublic 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
<script>      // JavaScript program to check if two given multisets      // are equivalent      function areSame(a, b)      {        if (a.length != b.length) return false;         // Create two unordered maps m1 and m2        // and insert values of both vectors.        var m1, m2;        m1 = {};        m2 = {};        for (var i = 0; i < a.length; i++)        {          if (m1.hasOwnProperty(a[i]))          {            m1[a[i]] = m1[a[i]] + 1;          } else {            m1[a[i]] = 1;          }          if (m2.hasOwnProperty(b[i])) {            m2[b[i]] = m2[b[i]] + 1;          } else {            m2[b[i]] = 1;          }        }         // Now we check if both unordered_maps        // are same of not.        for (const [key, value] of Object.entries(m1)) {          if (!m2.hasOwnProperty(key) || m2[key] != value) return false;        }        return true;      }       // Driver code      var a = [7, 7, 5];      var b = [7, 7, 5];      if (areSame(a, b)) document.write("Yes");      else document.write("No");             // This code is contributed by rdtank.    </script>
Yes
 
Time complexity : O(n) under the assumption that unordered_map find() and insert() operations work in O(1) time.Auxiliary Space: O(n) 
princiraj1992
Rajput-Ji
princi singh
29AjayKumar
_saurabh_jaiswal
rdtank
amankr0211
cpp-unordered_map
Arrays
Hash
Sorting
Arrays
Hash
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Data Structures
Window Sliding Technique
Search, insert and delete in an unsorted array
What is Data Structure: Types, Classifications and Applications
Chocolate Distribution Problem
What is Hashing | A Complete Tutorial
Internal Working of HashMap in Java
Hashing | Set 1 (Introduction)
Count pairs with given sum
Sort string of characters