Open In App

Find Duplicates of array using bit array

Improve
Improve
Like Article
Like
Save
Share
Report

You have an array of N numbers, where N is at most 32,000. The array may have duplicate entries and you do not know what N is. With only 4 Kilobytes of memory available, how would print all duplicate elements in the array ?. 

Examples:

Input : arr[] = {1, 5, 1, 10, 12, 10}
Output : 1 10
1 and 10 appear more than once in given
array.

Input : arr[] = {50, 40, 50}
Output : 50

Asked In: Amazon 

We have 4 Kilobytes of memory which means we can address up to 8 * 4 * 210 bits. Note that 32 * 210 bits is greater than 32000. We can create a bit with 32000 bits, where each bit represents one integer. Note: If you need to create a bit with more than 32000 bits, then you can create easily more and more than 32000; Using this bit vector, we can then iterate through the array, flagging each element v by setting bit v to 1. When we come across a duplicate element, we print it. Below is the implementation of the idea.

Implementation:

C++




// C++ program to print all Duplicates in array
#include <bits/stdc++.h>
using namespace std;
 
// A class to represent an array of bits using
// array of integers
class BitArray
{
    int *arr;
 
    public:
    BitArray() {}
 
    // Constructor
    BitArray(int n)
    {
        // Divide by 32. To store n bits, we need
        // n/32 + 1 integers (Assuming int is stored
        // using 32 bits)
        arr = new int[(n >> 5) + 1];
    }
 
    // Get value of a bit at given position
    bool get(int pos)
    {
        // Divide by 32 to find position of
        // integer.
        int index = (pos >> 5);
 
        // Now find bit number in arr[index]
        int bitNo = (pos & 0x1F);
 
        // Find value of given bit number in
        // arr[index]
        return (arr[index] & (1 << bitNo)) != 0;
    }
 
    // Sets a bit at given position
    void set(int pos)
    {
        // Find index of bit position
        int index = (pos >> 5);
 
        // Set bit number in arr[index]
        int bitNo = (pos & 0x1F);
        arr[index] |= (1 << bitNo);
    }
 
    // Main function to print all Duplicates
    void checkDuplicates(int arr[], int n)
    {
        // create a bit with 32000 bits
        BitArray ba = BitArray(320000);
 
        // Traverse array elements
        for (int i = 0; i < n; i++)
        {
            // Index in bit array
            int num = arr[i];
 
            // If num is already present in bit array
            if (ba.get(num))
                cout << num << " ";
 
            // Else insert num
            else
                ba.set(num);
        }
    }
};
 
// Driver code
int main()
{
    int arr[] = {1, 5, 1, 10, 12, 10};
    int n = sizeof(arr) / sizeof(arr[0]);
    BitArray obj = BitArray();
    obj.checkDuplicates(arr, n);
    return 0;
}
 
// This code is contributed by
// sanjeev2552


Java




// Java program to print all Duplicates in array
import java.util.*;
import java.lang.*;
import java.io.*;
 
// A class to represent array of bits using
// array of integers
public class BitArray
{
    int[] arr;
 
    // Constructor
    public BitArray(int n)
    {
        // Divide by 32. To store n bits, we need
        // n/32 + 1 integers (Assuming int is stored
        // using 32 bits)
        arr = new int[(n>>5) + 1];
    }
 
    // Get value of a bit at given position
    boolean get(int pos)
    {
        // Divide by 32 to find position of
        // integer.
        int index = (pos >> 5);
 
        // Now find bit number in arr[index]
        int bitNo  = (pos & 0x1F);
 
        // Find value of given bit number in
        // arr[index]
        return (arr[index] & (1 << bitNo)) != 0;
    }
 
    // Sets a bit at given position
    void set(int pos)
    {
        // Find index of bit position
        int index = (pos >> 5);
 
        // Set bit number in arr[index]
        int bitNo = (pos & 0x1F);
        arr[index] |= (1 << bitNo);
    }
 
    // Main function to print all Duplicates
    static void checkDuplicates(int[] arr)
    {
        // create a bit with 32000 bits
        BitArray ba = new BitArray(320000);
 
        // Traverse array elements
        for (int i=0; i<arr.length; i++)
        {
            // Index in bit array
            int num  = arr[i] - 1;
 
            // If num is already present in bit array
            if (ba.get(num))
                System.out.print(num +" ");
 
            // Else insert num
            else
                ba.set(num);
        }
    }
 
    // Driver code
    public static void main(String[] args) throws
                              java.lang.Exception
    {
        int[] arr = {1, 5, 1, 10, 12, 10};
        checkDuplicates(arr);
    }
}


Python3




# Python3 program to print all Duplicates in array
 
# A class to represent array of bits using
# array of integers
class BitArray:
 
    # Constructor
    def __init__(self, n):
 
        # Divide by 32. To store n bits, we need
        # n/32 + 1 integers (Assuming int is stored
        # using 32 bits)
        self.arr = [0] * ((n >> 5) + 1)
 
    # Get value of a bit at given position
    def get(self, pos):
 
        # Divide by 32 to find position of
        # integer.
        self.index = pos >> 5
 
        # Now find bit number in arr[index]
        self.bitNo = pos & 0x1F
 
        # Find value of given bit number in
        # arr[index]
        return (self.arr[self.index] &
                   (1 << self.bitNo)) != 0
 
    # Sets a bit at given position
    def set(self, pos):
 
        # Find index of bit position
        self.index = pos >> 5
 
        # Set bit number in arr[index]
        self.bitNo = pos & 0x1F
        self.arr[self.index] |= (1 << self.bitNo)
 
# Main function to print all Duplicates
def checkDuplicates(arr):
 
    # create a bit with 32000 bits
    ba = BitArray(320000)
 
    # Traverse array elements
    for i in range(len(arr)):
 
        # Index in bit array
        num = arr[i]
 
        # If num is already present in bit array
        if ba.get(num):
            print(num, end = " ")
 
        # Else insert num
        else:
            ba.set(num)
 
# Driver Code
if __name__ == "__main__":
    arr = [1, 5, 1, 10, 12, 10]
    checkDuplicates(arr)
 
# This code is contributed by
# sanjeev2552


C#




// C# program to print all Duplicates in array
  
// A class to represent array of bits using
// array of integers
using System;
 
class BitArray
{
    int[] arr;
 
    // Constructor
    public BitArray(int n)
    {
        // Divide by 32. To store n bits, we need
        // n/32 + 1 integers (Assuming int is stored
        // using 32 bits)
        arr = new int[(int)(n >> 5) + 1];
    }
 
    // Get value of a bit at given position
    bool get(int pos)
    {
        // Divide by 32 to find position of
        // integer.
        int index = (pos >> 5);
 
        // Now find bit number in arr[index]
        int bitNo = (pos & 0x1F);
 
        // Find value of given bit number in
        // arr[index]
        return (arr[index] & (1 << bitNo)) != 0;
    }
 
    // Sets a bit at given position
    void set(int pos)
    {
        // Find index of bit position
        int index = (pos >> 5);
 
        // Set bit number in arr[index]
        int bitNo = (pos & 0x1F);
        arr[index] |= (1 << bitNo);
    }
 
    // Main function to print all Duplicates
    static void checkDuplicates(int[] arr)
    {
        // create a bit with 32000 bits
        BitArray ba = new BitArray(320000);
 
        // Traverse array elements
        for (int i = 0; i < arr.Length; i++)
        {
            // Index in bit array
            int num = arr[i];
 
            // If num is already present in bit array
            if (ba.get(num))
                Console.Write(num + " ");
 
            // Else insert num
            else
                ba.set(num);
        }
    }
 
    // Driver code
    public static void Main()
    {
        int[] arr = {1, 5, 1, 10, 12, 10};
        checkDuplicates(arr);
    }
}
 
// This code is contributed by Rajput-Ji


Javascript




// JavaScript program to print all Duplicates in array
  
// A class to represent array of bits using
// array of integers
class BitArray {
    // Constructor
    constructor(n){
        // Divide by 32. To store n bits, we need
        // n/32 + 1 integers (Assuming int is stored
        // using 32 bits)
        this.arr = new Array((n >> 5) + 1);
    }
     
    // Get value of a bit at given position
    get(pos){
        // Divide by 32 to find position of
        // integer.
        let index = (pos >> 5);
  
        // Now find bit number in arr[index]
        let bitNo = (pos & 0x1F);
  
        // Find value of given bit number in
        // arr[index]
        let arrCopy = this.arr
        return (arrCopy[index] & (1 << bitNo)) != 0;
    }
    // Sets a bit at given position
    set(pos){
        // Find index of bit position
        var index = (pos >> 5);
  
        // Set bit number in arr[index]
        var bitNo = (pos & 0x1F);
        var arr1 = this.arr;
        arr1[index] = arr1[index] | (1 << bitNo);
        this.arr = arr1;
    }
}
  
// Main function to print all Duplicates
function checkDuplicates(arr){
    // create a bit with 32000 bits
    var ba = new BitArray(320000);
  
    // Traverse array elements
    for (var i = 0; i < arr.length; i++) {
        // Index in bit array
        var num = arr[i];
        // If num is already present in bit array
        if (ba.get(num))
            console.log(num);
        // Else insert num
        else
            ba.set(num);
    }
}
  
// Driver code
var a = [ 1, 5, 1, 10, 12, 10 ];
checkDuplicates(a);
  
// This code is contributed by Kirti Agarwal(kirtiagarwal23121999)


Output

1 10 

Time Complexity: O(N)

Space Complexity: O(1)



Last Updated : 23 Feb, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads