In: Accounting
Finding the complexity of Finding the largest two elements in a queue of size n+3 using Naïve search. with explain
Please mentioned below the answer
In computer science, a priority queue is an abstract data type which is like a regular queue or stack data structure, but where additionally each element has a "priority" associated with it. In a priority queue, an element with high priority is served before an element with low priority. In some implementations, if two elements have the same priority, they are served according to the order in which they were enqueued, while in other implementations, ordering of elements with the same priority is undefined.
While priority queues are often implemented with heaps, they are conceptually distinct from heaps. A priority queue is a concept like "a list" or "a map"; just as a list can be implemented with a linked list or an array, a priority queue can be implemented with a heap or a variety of other methods such as an unordered array.
Naive implementations
There are a variety of simple, usually inefficient, ways to implement a priority queue. They provide an analogy to help one understand what a priority queue is. For instance, one can keep all the elements in an unsorted list. Whenever the highest-priority element is requested, search through all elements for the one with the highest priority. (In big O notation: O(1) insertion time, O(n) pull time due to search.)
Naive approach: Use 2 loops. Check each element in the array with all other elements in the array and keep track of its count and also maintain the max counter which track the element repeats the maximum number of time.
Time Complexity : O(n^2) Space Complexity: O(1)
Code :
public class MaxRepeatingBruteForce {
public void MaxRepeatingElement(int [] arrA){
int maxCounter = 0;
int element=0;
for (int i = 0; i <arrA.length ; i++) {
int counter =1;
for (int j = i+1; j <arrA.length ; j++) {
if(arrA[i]==arrA[j]){
counter++;
}
}
if(maxCounter<counter){
maxCounter=counter;
element = arrA[i];
}
}
System.out.println("Element repeating maximum no of times: " + element + ", maximum count: " + maxCounter);
}
public static void main(String[] args) {
int [] arrA = {4, 1, 5, 2, 1, 5, 9, 8, 6, 5, 3, 2, 4, 7};
MaxRepeatingBruteForce m = new MaxRepeatingBruteForce();
m.MaxRepeatingElement(arrA);
}
}
Sorting approach: Sort the array, this will bring all the duplicates together if present. Now navigate the array and keep track of its count and also maintain the max counter which track the element repeats the maximum number of time.
Time Complexity : O(nlogn) Space Complexity: O(n) by using merge sort.
Code:
import java.util.Arrays;
public class MaxRepeatingUsingSorting {
public void maxRepeatingElementUsingSorting(int [] arrA){
if(arrA.length<1){
System.out.println("Inavlid Array");
return;
}
Arrays.sort(arrA);
int count=1;
int maxCount=1;
int currentElement = arrA[0];
int maxCountElement =arrA[0];
for (int i = 1; i <arrA.length ; i++) {
if(currentElement==arrA[i]){
count++;
}else{
if(count>maxCount){
maxCount = count;
maxCountElement = currentElement;
}
currentElement = arrA[i];
count = 1;
}
}
System.out.println("Element repeating maximum no of times: " + maxCountElement + ", maximum count: " + maxCount);
}
public static void main(String[] args) {
int [] arrA = {4, 1, 5, 2, 1, 5, 9, 8, 6, 5, 3, 2, 4, 7};
MaxRepeatingUsingSorting m = new MaxRepeatingUsingSorting();
m.maxRepeatingElementUsingSorting(arrA);
}
}
Better Solution (Conditional) : O(n) time and O(1) extra space.
§ This solution works only if array has positive integers and all the elements in the array are in range from 0 to n-1 where n is the size of the array.
§ Navigate the array.
§ Update the array as for ith index :- arrA[arrA[i]% n] = arrA[arrA[i]% n] + n;
§ Now navigate the updated array and check which index has the maximum value, that index number is the element which has the maximum occurrence in the array.
§ See the picture below for more explanation.
Similar approach used in problem : if array has all consecutive numbers.
public class MaxRepeatingElement {
public void MaxRepeatingElementInPlace(int [] arrA){
int size = arrA.length;
int maxCount=0;
int maxIndex=0;
for (int i = 0; i <size ; i++) {
//get the index to be updated
int index = arrA[i]% size;
arrA[index] = arrA[index] + size;
}
for (int i = 0; i <size ; i++) {
if(arrA[i]/size>maxCount){
maxCount=arrA[i]/size;
maxIndex=i;
}
}
System.out.println("Element repeating maximum no of times: " + maxIndex + ", maximum count: " + maxCount);
}
public static void main(String[] args) {
int [] arrA = {4, 1, 5, 2, 1, 5, 9, 8, 6, 5, 3, 2, 4, 7};
MaxRepeatingElement m = new MaxRepeatingElement();
m.MaxRepeatingElementInPlace(arrA);
}
}