To find the K most frequent elements present in an array we do the following
Program for finding the top k most frequent elements in an array.
from typing import List # For annotations
import heapq
class MostFreq :
def __init__ (self, num, freq) :
self.num = num
self.freq = freq
# Highest frequency element goes at the top.
# As heapq by default is a min-heap, we override the
# __lt__ (less than) or __gt__ (greater than) function to convert
# the heapq of the objects of MostFreq from a min-heap to a max-heap
#def __gt__ (self, arg_obj) :
# return self.freq < arg_obj.freq
def __lt__ (self, arg_obj) :
return self.freq > arg_obj.freq
def __eq__ (self, arg_obj) :
return self.freq == arg_obj.freq
def K_TopMost_Frequent (num_list : List[int], k : int) -> List[int] :
list_mostfreq = []
freq = {}
result_mostfreq = []
# Store the frequency of all the numbers in a dictionary.
for num in num_list :
if num not in freq :
freq[num] = 1
else :
freq[num] += 1
# Create a max (frequency) heap from the entries stored in a dictionary
for key, value in freq.items() :
obj = MostFreq(key, value)
heapq.heappush(list_mostfreq, obj) # The list_mostfreq is now a max heap
# Store the top-most k elements from the max heap in the list
count = 0
while (count < k and len(list_mostfreq) > 0 ) :
obj = heapq.heappop(list_mostfreq)
result_mostfreq.append(obj.num)
count += 1
return result_mostfreq
def main() :
num = [ 1, 1, 1, 2, 2, 3, 40, 40, 40, 40, 40, 10, 10, 12, 12, 7, 7, 7, 7 ]
print("Array numbers : " + str(num))
print("Fetching most frequent k elements in the array.")
k = int(input("Enter k : "))
result = K_TopMost_Frequent(num, k)
print(result)
if __name__ == "__main__" :
main()
Output
Array numbers : [1, 1, 1, 2, 2, 3, 40, 40, 40, 40, 40, 10, 10, 12, 12, 7, 7, 7, 7]
Fetching most frequent k elements in the array.
Enter k : 5
[40, 7, 1, 12, 10]
Array numbers : [1, 1, 1, 2, 2, 3, 40, 40, 40, 40, 40, 10, 10, 12, 12, 7, 7, 7, 7]
Fetching most frequent k elements in the array.
Enter k : 1
[40]
Array numbers : [1, 1, 1, 2, 2, 3, 40, 40, 40, 40, 40, 10, 10, 12, 12, 7, 7, 7, 7]
Fetching most frequent k elements in the array.
Enter k : 2
[40, 7]
#include<iostream>
#include<vector>
#include<map>
#include<queue>
class MostFreq {
public:
int num;
int freq;
MostFreq (int arg_num, int arg_freq) : num(arg_num), freq(arg_freq)
{}
// To store the least frequent element at the top, just change the frequency
// comparision.
// Highest frequency element goes at the top.
bool operator < (const MostFreq& obj) const {
if (this->freq <= obj.freq)
return true;
return false;
}
};
std :: vector<int> K_TopMost_Frequent (std :: vector<int>& nums, int k) {
std :: priority_queue<MostFreq> pq_mostfreq;
std :: map<int, int> freq;
std :: vector<int> vec_mostfreq;
// Store the frequency of all the numbers in a map.
for (const auto& n : nums) {
if (freq.find(n) != freq.end())
freq[n]++;
else
freq[n] = 1;
}
// Create a max (frequency) heap from the entries store in a map.
for (const auto m : freq) {
MostFreq obj(m.first, m.second);
pq_mostfreq.push(obj);
}
// Store the top-most k elements from the max heap into the vector
int count = 0;
while (count < k && !pq_mostfreq.empty()) {
MostFreq obj = pq_mostfreq.top();
pq_mostfreq.pop();
vec_mostfreq.push_back(obj.num);
count++;
}
return vec_mostfreq;
}
int main() {
std :: vector<int> num { 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 4, 10, 10, 10, 10 };
std :: cout << "Array numbers : ";
for (const auto& n : num)
std :: cout << n << " ";
int k;
std :: cout << "\nFetching most frequent k elements in the array." << std :: endl;
std :: cout << "Enter k : ";
std :: cin >> k;
std :: vector<int> result = K_TopMost_Frequent(num, k);
for (const auto& n : result)
std :: cout << n << " ";
return 0;
}
Output
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most frequent k elements in the array.
Enter k : 4
4 10 1 2
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most frequent k elements in the array.
Enter k : 1
4
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most / least frequent k elements in the array.
Enter k : 2
4 10
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most / least frequent k elements in the array.
Enter k : 5
4 10 1 2 3
import java.util.Scanner;
import java.util.PriorityQueue;
import java.util.HashMap;
class MostFreq {
int num; // Store the number
int freq; // Store the count of 'number' present in the array
MostFreq () {
}
MostFreq (int arg_num, int arg_freq) {
num = arg_num;
freq = arg_freq;
}
// Highest frequency element goes at the top.
public int[] K_TopMost_Frequent (int[] nums, int k) {
// Max-Heap using PriorityQueue to store the objects based on the frequency
PriorityQueue<MostFreq> pq_mostfreq = new PriorityQueue<>((obj_x, obj_y) -> Integer.compare(obj_y.freq, obj_x.freq));
HashMap<Integer, Integer> freq = new HashMap<Integer, Integer>();
int[] result = new int[k];
// Store the frequency of all the numbers in a map.
for (int n : nums) {
if (freq.get(n) != null) {
int count = freq.get(n);
freq.put(n, count+1);
} else {
freq.put(n, 1);
}
}
// Create a max (frequency) heap from the entries stored in the map.
freq.forEach ((key, value) -> pq_mostfreq.add(new MostFreq(key, value)));
// Store the top-most k elements from the max heap into the vector
int count = 0;
while (count < k && !pq_mostfreq.isEmpty()) {
MostFreq obj = pq_mostfreq.remove();
result[count] = obj.num;
count++;
}
return result;
}
public static void main (String[] args) {
int[] nums = { 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 4, 10, 10, 10, 10 };
System.out.print("Array numbers : ");
for (int n : nums)
System.out.print(n + " ");
System.out.println("\nFetching most frequent k elements in the array.");
System.out.print("Enter k : ");
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
MostFreq obj = new MostFreq();
int[] result = obj.K_TopMost_Frequent(nums, k);
for (int n : result)
System.out.print(n + " ");
}
}
Output
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most frequent k elements in the array.
Enter k : 2
4 10
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most frequent k elements in the array.
Enter k : 5
4 10 1 2 3
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most frequent k elements in the array.
Enter k : 3
4 10 1
Array numbers : 1 1 1 2 2 3 4 4 4 4 4 10 10 10 10
Fetching most frequent k elements in the array.
Enter k : 2
3 2