Algorithms | Searching | Question 3

• Last Updated : 28 Jun, 2021

Given a sorted array of integers, what can be the minimum worst case time complexity to find ceiling of a number x in given array? Ceiling of an element x is the smallest element present in array which is greater than or equal to x. Ceiling is not present if x is greater than the maximum element present in array. For example, if the given array is {12, 67, 90, 100, 300, 399} and x = 95, then output should be 100.
(A) O(LogLogn)
(B) O(n)
(C) O(Logn)
(D) O(Logn * Logn)

Explanation: We modify standard binary search to find ceiling. The time complexity T(n) can be written as

T(n) <= T(n/2) + O(1)

Solution of above recurrence can be obtained by Master Method. It falls in case 2 of Master Method. Solution is O(Logn).

#include<stdio.h>

/* Function to get index of ceiling of x in arr[low..high]*/
int ceilSearch(int arr[], int low, int high, int x)
{
int mid;

/* If x is smaller than or equal to the first element,
then return the first element */
if(x <= arr[low])
return low;

/* If x is greater than the last element, then return -1 */
if(x > arr[high])
return -1;

/* get the index of middle element of arr[low..high]*/
mid = (low + high)/2; /* low + (high – low)/2 */

/* If x is same as middle element, then return mid */
if(arr[mid] == x)
return mid;

/* If x is greater than arr[mid], then either arr[mid + 1]
is ceiling of x or ceiling lies in arr[mid+1…high] */
else if(arr[mid] < x)
{
if(mid + 1 <= high && x <= arr[mid+1])
return mid + 1;
else
return ceilSearch(arr, mid+1, high, x);
}

/* If x is smaller than arr[mid], then either arr[mid]
is ceiling of x or ceiling lies in arr[mid-1…high] */
else
{
if(mid – 1 >= low && x > arr[mid-1])
return mid;
else
return ceilSearch(arr, low, mid – 1, x);
}
}

/* Driver program to check above functions */
int main()
{
int arr[] = {1, 2, 8, 10, 10, 12, 19};
int n = sizeof(arr)/sizeof(arr[0]);
int x = 20;
int index = ceilSearch(arr, 0, n-1, x);
if(index == -1)
printf("Ceiling of %d doesn't exist in array ", x);
else
printf("ceiling of %d is %d", x, arr[index]);
getchar();
return 0;
}

Quiz of this Question

My Personal Notes arrow_drop_up
Related Articles