Question: Given a sorted array of n elements, possibly with duplicates, find the number of occurrences of an element.
Input: 4, 4, 8, 8, 8, 15, 16, 23, 23, 42. Find 8
Output: Count = 3
The most basic methodology to solve this problem is linear search. Just scan the array and count the number of occurrences. But this takes time O(n).
int linearSearchCount(int arr[], int n, int data) { int count = 0; int i = 0; for(i=0;i<n;i++) { if(arr[i] == data) count++; } return count; }
We can improve the time complexity by using binary search. The steps involved in this method are:-
- Do a binary search and search for the data in the array. Let us assume that the position is K.
- Now traverse left from the position K, until we get a different element. Keep a count of the number of elements. Let it be leftCount.
- Now traverse right from the position K, until we get a different element. Keep a count of the number of elements. Let it be rightCount.
- Total number of occurrences = leftCount + 1 + rightCount
#include<stdio.h> int binarySearchIterative(int arr[], int size, int data) { int low = 0; int high = size-1; int mid; while(low<=high) { mid = low + (high-low)/2; if(arr[mid] == data) return mid; else if(arr[mid] < data) low = mid + 1; else high = mid - 1; } return -1; } int binarySearchCount(int arr[], int len, int data) { // get the index of element int indexData = binarySearchIterative(arr, len, data); // get the leftCount int left = indexData - 1; int leftCount = 0; while(left>-1 && arr[left] == data) { leftCount++; left--; } // get the rightCount int right = indexData + 1; int rightCount = 0; while(right < len && arr[right] == data) { rightCount++; right++; } return (leftCount + 1 + rightCount); } int main(void) { int arr[] = {4, 4, 8, 8, 8, 15, 15, 16, 23, 42, 42}; int count = binarySearchCount(arr, 11, 8); printf("count = %d", count); return 0; }
Time Complexity:- O(log n + S), where S is the number of occurrences