📜  查找出现概率最大的元素的索引

📅  最后修改于: 2021-04-29 14:31:53             🧑  作者: Mango

给定一个整数数组,找到该数组中出现次数最多的元素,并以相等的概率随机返回其索引中的任何一个。

例子:

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.

想法是遍历数组一次,找出最大出现的元素及其频率n。然后,我们生成一个介于1和n之间的随机数r,最后返回数组中出现次数最多的元素的第r次出现。

以下是上述想法的实现–

C++
// C++ program to return index of most occurring element
// of the array randomly with equal probability
#include 
#include 
#include 
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 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 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;
}


Java
// 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 mp = new HashMap();
    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 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


Python3
# 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


输出:

Element with maximum frequency present at index 4

上述解决方案的时间复杂度为O(n )。
该程序使用的辅助空间为O(n)。