K Most occurring elements-heap

 



Given a non-empty array of repeating integers return the k most frequent elements.

Example 1:

Input:
N = 8
arr[] = {3,1,4,4,5,2,6,1}
K = 2
Output: 4
Explanation: Since, 4 and 1 are 2 most
occurring elements in the array with
their frequencies as 2, 2. So total
frequency is 2 + 2 = 4.


method 1:

Algorithm: 

1)save all the array elements and its corresponding frequencies in a unordered map

2)create a vector and push only the frequencies of the elements in the vector

3)sort the vector

4)Run a loop k times, and in each iteration remove the largest element from the end of the vector and add them


int kMostFrequent(int arr[], int n, int k) 
{ 
    
unordered_map<int,int> mp; //create a unordered map

for(int i=0;i<n;i++) 
mp[arr[i]]++;               // save all the array elements and its corresponding frequencies in map

vector<int> v;              //create a vector

for(auto u: mp){            //push only the frequencies in vector
v.push_back(u.second);
}

sort(v.begin(), v.end());    //sort the vector

int sum = 0;
while(k--){               //  remove the k number of largest elements from the end of the vector
sum += v.back();             // and add them
v.pop_back();
}

return sum;
} 
  • Time Complexity: O(d log d), where d is the count of distinct elements in the array. To sort the array O(d log d) time is needed.
  • Auxiliary Space: O(d), where d is the count of distinct elements in the array. To store the elements in Map O(d) space complexity is needed.





method 2:
similar to method one but instead of sorting we will use max heap(priority queue) in which largest element is always stored in root 

Store the frequency in a Priority Queue and create the Priority Queue, this takes O(n) time

Run a loop k times, and in each iteration remove the top of the priority queue and print the element.

int kMostFrequent(int arr[], int n, int k) 
{ 
    
unordered_map<int,int> mp; //create a unordered map

for(int i=0;i<n;i++) 
mp[arr[i]]++;               // save all the array elements and its corresponding frequencies in map

priority_queue <int>pq ;              //create a max heap

for(auto u: mp){            //push only the frequencies in heap
pq.push(u.second);
}


int sum = 0;
while(k--){               //  remove the k number of largest elements from the heap
sum += pq.top();          // and add them
pq.pop();
}

return sum;	
} 

Complexity Analysis: 

  • Time Complexity: O(k log d + d), where d is the count of distinct elements in the array. 
    To remove the top of priority queue O(log d) time is required, so if k elements are removed then O(k log d) time is required and to traverse the distinct elements O(d) time is required.
  • Auxiliary Space: O(d), where d is the count of distinct elements in the array. 
    To store the elements in HashMap O(d) space complexity is needed.


darkmode