Find an index of maximum occurring element with equal probability

Given an array of integers, find the most occurring element of the array and return any one of its indexes randomly with equal probability.

Examples:

Input: 
arr[] = [-1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5, 7, 8, 9]

Output:  
Element with maximum frequency present at index 6
OR
Element with maximum frequency present at Index 3
OR
Element with maximum frequency present at index 4
OR
Element with maximum frequency present at index 12

All outputs above have equal probability.



The idea is to iterate through the array once and find out the maximum occurring element and its frequency n. Then we generate a random number r between 1 and n and finally return the r’th occurrence of maximum occurring element in the array.

Below are implementation of above idea –

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to return index of most occurring element
// of the array randomly with equal probability
#include <iostream>
#include <unordered_map>
#include <climits>
using namespace std;
  
// Function to return index of most occurring element
// of the array randomly with equal probability
void findRandomIndexOfMax(int arr[], int n)
{
    // freq store frequency of each element in the array
    unordered_map<int, int> freq;
    for (int i = 0; i < n; i++)
        freq[arr[i]] += 1;
  
    int max_element; // stores max occurring element
  
    // stores count of max occurring element
    int max_so_far = INT_MIN;
  
    // traverse each pair in map and find maximum
    // occurring element and its frequency
    for (pair<int, int> p : freq)
    {
        if (p.second > max_so_far)
        {
            max_so_far = p.second;
            max_element = p.first;
        }
    }
  
    // generate a random number between [1, max_so_far]
    int r = (rand() % max_so_far) + 1;
  
    // traverse array again and return index of rth
    // occurrence of max element
    for (int i = 0, count = 0; i < n; i++)
    {
        if (arr[i] == max_element)
            count++;
  
        // print index of rth occurrence of max element
        if (count == r)
        {
            cout << "Element with maximum frequency present "
                 "at index " << i << endl;
            break;
        }
    }
}
  
// Driver code
int main()
{
    // input array
    int arr[] = { -1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5,
                  7, 8, 9 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // randomize seed
    srand(time(NULL));
  
    findRandomIndexOfMax(arr, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to return index of most occurring element
// of the array randomly with equal probability
import java.util.*;
  
class GFG
{
  
// Function to return index of most occurring element
// of the array randomly with equal probability
static void findRandomIndexOfMax(int arr[], int n)
{
    // freq store frequency of each element in the array
    HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();
    for (int i = 0; i < n; i++)
        if(mp.containsKey(arr[i]))
        {
            mp.put(arr[i], mp.get(arr[i]) + 1);
        }
        else
        {
            mp.put(arr[i], 1);
        }
  
    int max_element = Integer.MIN_VALUE; // stores max occurring element
  
    // stores count of max occurring element
    int max_so_far = Integer.MIN_VALUE;
  
    // traverse each pair in map and find maximum
    // occurring element and its frequency
    for (Map.Entry<Integer, Integer> p : mp.entrySet()) 
    {
        if (p.getValue() > max_so_far)
        {
            max_so_far = p.getValue();
            max_element = p.getKey();
        }
    }
      
    // generate a random number between [1, max_so_far]
    int r = (int) ((new Random().nextInt(max_so_far) % max_so_far) + 1);
  
    // traverse array again and return index of rth
    // occurrence of max element
    for (int i = 0, count = 0; i < n; i++)
    {
        if (arr[i] == max_element)
            count++;
  
        // print index of rth occurrence of max element
        if (count == r)
        {
            System.out.print("Element with maximum frequency present "
                +"at index " + i +"\n");
            break;
        }
    }
}
  
// Driver code
public static void main(String[] args)
{
    // input array
    int arr[] = { -1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5,
                7, 8, 9 };
    int n = arr.length;
    findRandomIndexOfMax(arr, n);
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to return index of most occurring element
# of the array randomly with equal probability
import random 
  
# Function to return index of most occurring element
# of the array randomly with equal probability
def findRandomIndexOfMax(arr, n):
  
    # freq store frequency of each element in the array
    mp = dict()
    for i in range(n) :
        if(arr[i] in mp):
            mp[arr[i]] = mp[arr[i]] + 1
          
        else:
            mp[arr[i]] = 1
          
    max_element = -323567
    # stores max occurring element
  
    # stores count of max occurring element
    max_so_far = -323567
  
    # traverse each pair in map and find maximum
    # occurring element and its frequency
    for p in mp : 
      
        if (mp[p] > max_so_far):
            max_so_far = mp[p]
            max_element = p
          
    # generate a random number between [1, max_so_far]
    r = int( ((random.randrange(1, max_so_far, 2) % max_so_far) + 1))
      
    i = 0
    count = 0
  
    # traverse array again and return index of rth
    # occurrence of max element
    while ( i < n ):
      
        if (arr[i] == max_element):
            count = count + 1
  
        # Print index of rth occurrence of max element
        if (count == r):
          
            print("Element with maximum frequency present at index " , i )
            break
        i = i + 1
      
# Driver code
  
# input array
arr = [-1, 4, 9, 7, 7, 2, 7, 3, 0, 9, 6, 5, 7, 8, 9
n = len(arr)
findRandomIndexOfMax(arr, n)
  
# This code is contributed by Arnab Kundu

chevron_right


Output:

Element with maximum frequency present at index 4

Time complexity of above solution is O(n).
Auxiliary space used by the program is O(n).

This article is contributed by Aditya Goel. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.




My Personal Notes arrow_drop_up

Article Tags :

1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.