• No se han encontrado resultados

B´ usqueda lineal y b´ usqueda binaria

5. Recursividad

6.1. Arreglos de una dimensi´ on (vectores)

6.1.5. B´ usqueda lineal y b´ usqueda binaria

B´usqueda lineal

La b´usqueda lineal es muy sencilla y natural, dado que es la forma en que los seres humanos realizamos b´usquedas.

La idea es bastante simple, se va recorriendo uno a uno la secuencia de elementos sobre los que se desea realizar la b´usqueda (conjunto de datos), y se va comparando cada uno de ellos con el elemento a buscar (clave o llave); si existe coincidencia, entonces la b´usqueda ha tenido ´exito y se reporta el ´ındice (posici´on) del elemento dentro del conjunto de datos.

Tambi´en puede ocurrir que se haya recorrido todo el conjunto de datos y no se haya encontrado coincidencia con la clave, en ´este caso, se reporta dicha situaci´on con una posici´on (´ındice) no v´alida (-1) respecto al conjunto de datos.

La funci´on busquedaLineal de las l´ıneas 8-15 del Ejemplo 6.5, recibe un arreglo de enteros constantes1 a (conjunto de datos), un entero x (clave o llave), y un n´umero n que representa la cantidad de datos del conjunto sobre los que se realizar´a la b´usqueda2.

El ciclo for de la l´ınea 11 realiza el recorrido sobre el conjunto de datos, mientras que el if de la l´ınea 12 verifica la coincidencia con el elemento clave;

1El modificador const le indica al compilador que el arreglo es de elementos constan- tes, y previene al programador de alguna modificaci´on accidental o incidental sobre los elementos del arreglo afectado por el modificador. En resumen, vuelve al arreglo afectado de s´olo lectura: no es posible modificar sus elementos dentro de la funci´on.

6.1. ARREGLOS DE UNA DIMENSI ´ON (VECTORES) 119

en caso de existir, se reporta en la l´ınea 13, pero si el elemento clave no existe, se reporta dicha situaci´on en la l´ınea 14.

B´usqueda binaria

La b´usqueda binaria se fundamenta en un pre requisito sumamente im- portante: que el conjunto de datos est´e ordenado.

1 /∗ B i b l i o t e c a de f u n c i o n e s que im plem ent a l a b u s q u e d a 2 l i n e a l y l a b u s q u e d a b i n a r i a ( i t e r a t i v a ) . 3 @autor R i c a r d o Ruiz R o d r i g u e z 4 ∗/ 5 6 #d e f i n e NO ENCONTRADO −1 7 8 i n t b u s q u e d a L i n e a l ( const i n t a [ ] , i n t x , i n t n ) { 9 i n t i ; 10 11 f o r ( i = 0 ; i < n ; i ++) 12 i f ( x == a [ i ] ) 13 return i ; 14 return NO ENCONTRADO; 15 } 16 17 i n t b u s q u e d a B i n a r i a ( const i n t a [ ] , i n t x , i n t l i m i n f , i n t l i m s u p ) { 18 i n t medio ; 19 20 while ( l i m i n f <= l i m s u p ) { 21 medio = ( l i m i n f + l i m s u p ) / 2 ; 22 i f ( x == a [ medio ] ) 23 return medio ; 24 e l s e i f ( x < a [ medio ] ) 25 l i m s u p = medio − 1 ; 26 e l s e 27 l i m i n f = medio + 1 ; 28 } 29 30 return NO ENCONTRADO; 31 }

Ejemplo 6.5: Funciones para la b´usqueda lineal y la b´usqueda binaria

La importancia de tal pre requisito es tal que, si no se cumple, no se garantiza el buen funcionamiento de la b´usqueda binaria.

La b´usqueda binaria capitaliza el hecho de que los datos est´en ordenados para ir eliminando en cada iteraci´on, a la mitad de los datos, lo cual la hace muy eficiente, pero el costo a pagar es el ordenamiento previo de los datos.

Una analog´ıa con la forma de realizar la b´usqueda de una persona en un directorio telef´onico, puede ayudar a visualizar mejor el funcionamiento de la b´usqueda binaria.

120 CAP´ITULO 6. ARREGLOS

Suponga que se desea buscar en un directorio telef´onico el siguiente nom- bre: Ricardo Ruiz Rodr´ıguez. En M´exico los nombres aparecen registrados en el directorio en base al primer apellido, segundo apellido y nombre(s) de las personas registradas. Supongamos tambi´en que se decide abrir el directorio por la mitad (aproximadamente), y que la lista de apellidos que vemos es Murrieta.

¿Hacia qu´e parte del directorio deber´ıamos dirigir la b´usqueda?. Deber´ıa ser obvio que hacia la segunda mitad, ya que Ruiz se encuentra alfab´eti- camente despu´es que Murrieta. Pues bien, ´esta es en esencia la idea de la b´usqueda binaria.

El Ejemplo 6.5 muestra en las l´ıneas 17-31 la funci´on que implementa el mecanismo de b´usqueda binaria.

La funci´on recibe (l´ınea 17) un arreglo de elementos constantes a (con- junto de b´usqueda), el elemento a buscar x (clave o llave), y dos n´umeros que representan las posiciones de los l´ımites inferior (lim inf ) y superior (lim sup) del conjunto de b´usqueda respectivamente. Estos l´ımites en general coinci- den con el ´ındice inferior y superior del arreglo, pero no necesariamente tiene que ser as´ı, el conjunto de b´usqueda podr´ıa ser un subconjunto de todos los elementos.

La expresi´on condicional de la estructura de repetici´on while de la l´ınea 20, controla la continuidad o no de la b´usqueda del elemento x sobre el arreglo a. En cuanto ya no se cumpla dicha expresi´on, se sabr´a que el elemento clave no existe en el conjunto de b´usqueda (¿por qu´e?), y dicha situaci´on se reporta en la l´ınea 30.

La l´ınea 20 es la f´ormula del punto medio, y calcula el elemento central del conjunto de b´usqueda. En analog´ıa al ejemplo del directorio telef´onico, ´esta ser´ıa la simulaci´on de abrirlo aproximadamente a la mitad.

La estructura if/else anidada de las l´ıneas 22-27 determina lo siguiente:

Si la clave se encontr´o (l´ınea 22), se regresa su posici´on dentro del conjunto (l´ınea 23).

Si no se encontr´o y hay que buscarla en la parte izquierda del conjunto (l´ınea 24), se ajusta el l´ımite superior (l´ınea 25) para re definir un nuevo subconjunto de b´usqueda.

Si la clave no es igual ni menor respecto al elemento actual (a[medio] ), por tricotom´ıa de n´umeros, no le queda otra (l´ınea 26) m´as que estar (si existe) en la parte derecha del conjunto de b´usqueda, por lo que se

6.1. ARREGLOS DE UNA DIMENSI ´ON (VECTORES) 121

ajusta el l´ımite inferior (l´ınea 27), para re definir el nuevo subconjunto de b´usqueda.

Finalmente, si no se ha encontrado la clave, y los l´ımites del subconjunto de b´usqueda son v´alidos, se repite nuevamente todo el proceso descrito, pero sobre un conjunto de b´usqueda con menos datos, de hecho la mitad de los datos en cada iteraci´on.

Probablemente el lector haya tenido una sensaci´on parecida a un deja vu y haya venido a su mente el concepto de recursividad. La b´usqueda bi- naria puede ser abordada utilizando un enfoque recursivo. En la secci´on de ejercicios tendr´a la oportunidad de poner en pr´actica dicho enfoque.