Programa Python3 para techo en una array ordenada

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 
 

Python3

# Function to get index of ceiling of x in arr[low..high] */
def ceilSearch(arr, low, high, x):
  
    # 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 */
    i = low
    for i in range(high):
        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 and arr[i+1] >= x:
            return i+1
          
    # If we reach here then x is greater than the last element 
    # of the array,  return -1 in this case */
    return -1
  
# Driver program to check above functions */
arr = [1, 2, 8, 10, 10, 12, 19]
n = len(arr)
x = 3
index = ceilSearch(arr, 0, n-1, x);
  
if index == -1:
    print ("Ceiling of %d doesn't exist in array "% x)
else:
    print ("ceiling of %d is %d"%(x, arr[index]))
  
# This code is contributed by Shreyanshi Arun

Producción : 

ceiling of 3 is 8

Complejidad de tiempo: O(n)
Método 2 (búsqueda binaria) 
En lugar de usar la búsqueda lineal, aquí se usa la búsqueda binaria para encontrar el índice. La búsqueda binaria reduce la complejidad del tiempo a O (Iniciar sesión). 
 

Python3

# Function to get index of ceiling of x in arr[low..high]*/
def ceilSearch(arr, low, high, x):
  
    # 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] */ 
    elif arr[mid] < x:
        if mid + 1 <= high and 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 and x > arr[mid-1]:
            return mid
        else:
            return ceilSearch(arr, low, mid - 1, x)
   
# Driver program to check above functions */
arr = [1, 2, 8, 10, 10, 12, 19]
n = len(arr)
x = 20
index = ceilSearch(arr, 0, n-1, x);
  
if index == -1:
    print ("Ceiling of %d doesn't exist in array "% x)
else:
    print ("ceiling of %d is %d"%(x, arr[index]))
  
# This code is contributed by Shreyanshi Arun

Producción : 
 

Ceiling of 20 doesn't exist in array 

Complejidad de tiempo: O (Iniciar sesión)
 

Artículos relacionados:  
Piso en una array ordenada  
Encuentre piso y techo en una array no ordenada
Escriba comentarios si encuentra que alguno de los códigos/algoritmos anteriores es incorrecto, o encuentra mejores formas de resolver el mismo problema, o si desea compartir el código para la implementación del piso.
 

Consulte el artículo completo sobre Techo en una array ordenada para obtener más detalles.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *