Dada una array ordenada y un valor x, el techo de x es el elemento más pequeño de la array mayor o igual que x, y el piso es el elemento más grande menor o igual que x. Suponga que la array está ordenada en orden no decreciente. Escribe funciones eficientes para encontrar el suelo y el techo de x.
Ejemplos:
For example, let the input array be {1, 2, 8, 10, 10, 12, 19} For x = 0: floor doesn't exist in array, ceil = 1 For x = 1: floor = 1, ceil = 1 For x = 5: floor = 2, ceil = 8 For x = 20: floor = 19, ceil doesn't exist in array
En los métodos a continuación, hemos implementado solo funciones de búsqueda de techo. La búsqueda de piso se puede implementar de la misma manera.
Método 1 (búsqueda lineal)
Algoritmo para buscar el techo de x:
1) Si x es menor o igual que el primer elemento en la array, devuelve 0 (índice del primer elemento)
2) De lo contrario, busque linealmente un índice i tal que x se encuentre entre arr[i] y arr[i+1].
3) Si no encontramos un índice i en el paso 2, devuelve -1
C++
// C++ implementation of above approach#include using namespace std;/* Function to get index of ceiling of x in arr[low..high] */int ceilSearch(int arr[], int low, int high, int x){int i;/* If x is smaller than or equal to first element,then return the first element */if(x <= arr[low]) return low; /* Otherwise, linearly search for ceil value */ for(i = low; i < high; i++) { if(arr[i] == x) return i; /* if x lies between arr[i] and arr[i+1] including arr[i+1], then return arr[i+1] */ if(arr[i] < x && arr[i+1] >= x)return i+1;}/* If we reach here then x is greater than the last elementof the array, return -1 in this case */return -1;}/* Driver code*/int main(){int arr[] = {1, 2, 8, 10, 10, 12, 19};int n = sizeof(arr)/sizeof(arr[0]);int x = 3;int index = ceilSearch(arr, 0, n-1, x);if(index == -1)cout << "Ceiling of " << x << " doesn't exist in array "; else cout << "ceiling of " << x << " is " << arr[index]; return 0; } // This is code is contributed by rathbhupendra [tabbyending]Output : ceiling of 3 is 8Time Complexity : O(n)Method 2 (Binary Search) Instead of using linear search, binary search is used here to find out the index. Binary search reduces time complexity to O(Logn).
C++
#include using namespace std;/* Function to get index ofceiling of x in arr[low..high]*/int ceilSearch(int arr[], int low, int high, int x){int mid;/* If x is smaller thanor 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 xor 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[low...mid-1] */ else { if(mid - 1 >= low && x > arr[mid – 1])return mid;elsereturn ceilSearch(arr, low, mid – 1, x);}}// Driver Codeint 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)cout << "Ceiling of " << x << " doesn't exist in array "; else cout << "ceiling of " << x << " is " << arr[index]; return 0; } // This code is contributed by rathbhupendra [tabbyending]Output : Ceiling of 20 doesn't exist in array Time Complexity: O(Logn) Related Articles: Floor in a Sorted Array Find floor and ceil in an unsorted arrayPlease write comments if you find any of the above codes/algorithms incorrect, or find better ways to solve the same problem, or want to share code for floor implementation. Please refer complete article on Ceiling in a sorted array for more details!
¿Escribir código en un comentario? Utilice ide.geeksforgeeks.org , genere un enlace y compártalo aquí.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA