You are on page 1of 18

6.2. Método de búsqueda BINARIA Editar 0 6… a. guadalupe castañeda santiago clara ramirez cruz judith y. paz lopez nadia m.

chavez ruiz leonardo m. vasquez mejía

Búsqueda Binaria. La búsqueda binaria es el método más eficiente para encontrar elementos en un arreglo ordenado. El proceso comienza comparando el elemento central del arreglo con el valor buscado. Si ambos coinciden finaliza la búsqueda. Si no ocurre así, el elemento buscado será mayor o menor en sentido estricto que el central del arreglo. Si el elemento buscado es mayor se procede a hacer búsqueda binaria en el subarray superior, si el elemento buscado es menor que el contenido de la casilla central, se debe cambiar el segmento a considerar al segmento que está a la izquierda de tal sitio central. Búsqueda binaria o dicotómica Para utilizar este algoritmo, el array debe estar ordenado. La búsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays más pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda se termina. Si el elemento es menor, debe estar (si está) en el primer subarray, y si es mayor está en el segundo. Por ejemplo, para buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos:

Búsqueda Binaria Si la tabla de números está ordenada, por ejemplo, en orden creciente, es posible utilizar para la búsqueda un algoritmo más eficiente que se basa en un concepto muy utilizado en la programación: dividir para vencer. Si está ordenada la tabla y miramos el número situado en la mitad para ver si es mayor o menor que el número buscado (o con suerte igual), sabremos si la búsqueda ha de proceder en la subtabla con la mitad de tamaño que está antes o después de la mitad. Si se repite recursivamente el algoritmo al final o bien encontraremos el número sobre una tabla de un sólo elemento o estaremos seguros de que no se encuentra allí. Este método permite buscar un valor en una matriz que se esta ordenando ascendentemente utilizando el algoritmo de búsqueda binaria. Se trata de un algoritmo muy eficiente en cuanto

4. [[code format="code"]] namespace busquedabinaria{ public partial class Form1 : Form { public int[] num = new int[100]. evaluamos si vector[Icentro] es mayor o menor que la clave. long.6. Se determina un índice central. entonces quedaría Iarriba = 10. tipo clave) Donde m representa la matriz. Iarriba. clave es el valor que se desea buscar del mismo tipo que los elementos de la matriz. en este caso quedaría Icentro = 5. tipo es cualquier tipo de datos de los siguientes: objet. Iabajo = 6.14.16. flota. Si son distintos. La clave que queremos buscar es 6. Icentro = (Iarriba + Iabajo)/2. Iarriba=0 e Iabajo=10 respectivamente. si es igual ya encontramos la clave y devolvemos Icentro. string.el tiempo requerido para realizar una búsqueda es muy pequeño.18.10. short. En nuestro caso vector[Icentro] = 5 < 6. Y volvemos al paso 2. byte. public int x. entonces la parte del arreglo vector*0…5+ ya puede descartarse. La sintaxis expresada de forma genérica para realizar este método es la siguiente: Int BinarySearch ([ ] m.12. etc. Por ejemplo supongamos que tenemos este vector: int vector[10] = {2. La búsqueda binaria sólo se puede implementar si el arreglo está ordenado. Reasignamos Iarriba o Iabajo para obtener la nueva parte del arreglo en donde queremos buscar. queda igual ya que sigue siendo el tope. int. La idea consiste en ir dividiendo el arreglo en mitades.20}. como el arreglo está ordenado al hacer esto ya podemos descartar una mitad del arreglo asegurándonos que en esa mitad no está la clave que buscamos. double. El algoritmo funciona de la siguiente manera Se determinan un índice arriba y un índice abajo.8. public Form1() . Iabajo lo tenemos que subir hasta 6. Evaluamos si vector[Icentro] es igual a la clave de búsqueda. char.

if ( num[x] == textBox1) Encontrado = true. EventArgs e) { int Primero = 0. Ultimo = N . else { if (num[x] > textBox1) Ultimo = Centro . else Primero = Centro + 1. } private void button1_Click(object sender.1. if (textBox1 != 0) { while ((Primero <= Ultimo) && (Encontrado == false)) { Centro = (Primero + Ultimo) / 2. } } } } private void button3_Click(object sender.{ InitializeComponent(). EventArgs e) { .Centro = 0.1.

else label2 = "el numero no fue encontrado". sobre todo cuando de se trata de encontrar una cantidad de elementos similares. El resultado de una búsqueda puede ser un éxito. Búsqueda externa.num[x] = textBox1. La búsqueda es la operación más importante en el procesamiento de información.1 Búsqueda secuencial 6. si se encuentra la información o un fracaso. en cambio en el segundo se dificulta un poco más el proceso. } } } 6. ya que permite recuperar datos previamente almacenados.2 Búsqueda binaria 6. si no la encuentra. Búsqueda interna. } private void label2_Click(object sender. en el primer caso la búsqueda es más fácil. . EventArgs e) { if (Encontrado == false) label2 = "el numero fue encontrado". Los métodos de búsqueda se clasifican en: Búsqueda interna.3 Búsqueda por funciones de HASH Métodos de búsqueda. La búsqueda interna es aquella en la que todos los elementos de la estructura estática (arreglo) o dinámica (lista ligada o árbol) se encuentran almacenados en la memoria principal de la computadora. La búsqueda se puede aplicar sobre elementos previamente ordenados o sobre elementos desordenados.

1. el resultado de la búsqueda nos mostraría las posiciones 0. 3. 5. En cambio con una estructura ordenada al encontrar el elemento por primera vez podemos suponer que una vez que el elemento ya no sea igual al que estamos buscando. El método de búsqueda secuencial consiste en revisar la estructura de datos elemento por elemento hasta encontrar el dato que estamos buscando. La búsqueda secuencial se puede aplicar a estructuras de datos ordenadas o desordenadas. 8. ya no es necesario llegar hasta el fin de la estructura. Ejemplo. 3. 8. Si tenemos la estructura anterior pero ordenada 0. o hasta llegar al final de la estructura de datos. Elementos Posiciones Posiciones donde 0 1 2 3 5 5 5 7 8 9 0 1 2 3 4 5 6 7 8 9 × × × × √ √ √ × 5 8 3 2 9 5 7 0 5 1 0 1 2 3 4 5 6 7 8 9 . Hash (transformación de claves) Secuencial. 9 y estamos buscando el mismo número 5. 5. 0. Normalmente cuando una función de búsqueda concluye con éxito. Elementos Posiciones Posiciones donde √ × × × × √ × × √ × encontró el número 5 Ejercicio. Crear un programa que aplique una búsqueda secuencial de un dato dentro de un arreglo de elementos desordenados y presenta la o las posiciones donde encontró el dato. 5. 7. el proceso de búsqueda debe continuar hasta que se llegue al fin de la estructura. 2. 5. y el proceso terminaría ya que el número 7 no es menor ni igual al que estamos buscando. 7. Binaria. 1 y estamos buscando el número 5. Si se aplica a una estructura desordenada y el elemento que se está buscando existe más de una vez en la estructura.Los métodos de búsqueda interna más importantes son: Secuencial o lineal. 5. 9. Si tenemos una estructura con los elementos 5. 5 y 8 y el proceso terminaría al llegar al numero 1 que es el ultimo de la lista de elementos. y 6. 2. Ejemplo. 5. el resultado de la búsqueda nos mostraría las posiciones 4. lo que interesa es conocer en qué posición fue encontrado el elemento buscado.

Debemos destacar que este método de búsqueda solo funciona con estructuras de datos previamente ordenadas. Hash. dividiendo cada vez a la mitad el proceso de búsqueda. Si tenemos una estructura ordenada 0. se determina si el elemento buscado es menor o mayor al central. en caso de no ser iguales. dividiendo el resultado de la suma entre dos para obtener la posición central generada por el cociente de la división. El método de búsqueda binaria divide el total de los elementos en dos. Elementos Posiciones Posiciones donde i encontró el número 5 Este proceso debe sumar la posición inicial y la final. Binaria. 3. comparándolo con los métodos anteriores. Este método permite que el acceso a los datos sea por una llave que indica directamente la posición donde están guardados los datos que se buscan. 1. 5. el resultado de la búsqueda nos mostraría la posicione 4 y el proceso terminaría ya que el elemento buscado no es diferente al que esta en la posición central. 7. 2. Crear un programa que aplique una búsqueda binaria de un dato dentro de un arreglo de elementos ordenados y presenta la posición donde encontró el dato. en este caso es (0+9)/2 = 4. Ejercicio. Ejemplo. esta posición se compara con el elemento que estamos buscando y como son iguales la búsqueda se detiene mostrando la posición donde lo encontró. hasta encontrar el elemento buscado o que la división ya no sea posible. 5. 8.encontró el número 5 Ejercicio. 9 y estamos buscando el número 5. para determinar si la búsqueda continua del lado izquierdo (menor) o derecho (mayor) del central. Prácticamente trabaja con una función que transforma la llave o dato clave en una dirección (índice) dentro de la estructura y que en ocasiones puede generar una colisión. 5. Crear un programa que aplique una búsqueda secuencial de un dato dentro de un arreglo de elementos ordenados y presenta la o las posiciones donde encontró el dato. repitiendo el mismo proceso de división y comparación. Además tiene la ventaja de que el tiempo de búsqueda es independiente del número de elementos de la estructura que los almacena. lo que hace que el método sea más eficiente. El método de búsqueda hash o por transformación de clave aumenta la velocidad de búsqueda sin necesidad de que los elementos estén previamente ordenados. √ F 0 1 2 3 5 5 5 7 8 9 0 1 2 3 4 5 6 7 8 9 . comparando el elemento buscado con el central. que se define como una misma dirección para dos o más claves distintas.

Para trabajar con este método de búsqueda debe elegir previamente dos cosas: Una función hash que sea facil de calcular y que distribuya uniformemente las direcciones. se cambia el valor de 100 por el numero primo más cercano a él. las direcciones generadas son las siguientes: dirección = (7259%100) = 59 dirección = (9359%100) = 59 Estos dos casos generan una colisión. Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359. ya que los dos números no se pueden asignar dentro de la misma dirección en la estructura. generando posiciones alternativas. Función cuadrada. las direcciones generadas son las siguientes: . Para encontrar la función hash no existe una regla que permita determinar cuál será la función más apropiada para generar un conjunto de claves que aseguren la máxima uniformidad en la distribución de las mismas. La función módulo o por división toma el residuo de la división entre la clave y el total de elementos de la estructura. Un método para resolver colisiones. Función plegamiento. generando la siguiente fórmula: dirección = (clave % total elementos) Para lograr una mayor uniformidad en la distribución de los elementos. La fórmula hash es la siguiente: dirección = dígitos centrales (clave2) Ejemplo. Función truncamiento. Algunas de las funciones hash más utilizadas son las siguientes: Función módulo (por división). se toman los dígitos centrales como la dirección. Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359. Ejemplo. lo que generaría las siguientes direcciones: dirección = (7259%97) = 81 dirección = (9359%97) = 47 La función cuadrada como su nombre lo indica eleva al cuadrado la clave y del resultado. en este caso seria un 97. para evitar la colisión. El número de dígitos a tomar se determina del por el rango del índice de toda la estructura. se debe buscar que el valor que se usa en el total de elementos sea un número primo más cercano al tamaño de la estructura.

Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359. La elección de los dígitos es arbitraria. . las direcciones generadas son las siguientes: dirección = elegir dígitos (7. ya sea una serie de sumas o de multiplicaciones. podrían tomarse los de las posiciones pares o impares para con ellos generar la dirección donde se almacenara la clave. La función plegamiento divide la clave en partes de igual número de dígitos (la última puede tener menos dígitos). su fórmula es la siguiente: dirección = elegir dígitos (unión dígitos) Ejemplo. La función truncamiento toma algunos de los dígitos de las claves y forma con ellos una dirección. Algunos de los métodos para la solución de colisiones más utilizados son: Reasignación. tomando como dirección los dígitos menos significativos. La fórmula seria la siguiente: dirección = dígitos menos significativos (suma de partes) dirección = dígitos menos significativos (multiplicación de partes) Ejemplo. las direcciones generadas son las siguientes: dirección = dígitos menos significativos (72 + 59) = dígitos menos significativos (131) = 31 dirección = dígitos menos significativos (93 + 59) = dígitos menos significativos (152) = 52 Como el rango de claves es de 1 a 100 se toman dos dígitos para las particiones y para la dirección. después de realizar una operación entre las partes. 5) = 75 dirección = elegir dígitos (9.dirección = dígitos centrales (72592) = 52693081 = 93 dirección = dígitos centrales (93592) = 87590881 = 90 Como el rango de claves es de 1 a 100 se toman dos dígitos centrales. Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359. 5) = 95 Para este caso se tomaron los dígitos impares y se unieron de izquierda a derecha. este método debe entrar en operación cuando la función hash asigna la misma dirección a dos o mas claves diferentes. Un método para la solución de colisiones es tan importante como la función hash. uniendo los dígitos de izquierda a derecha o de derecha a izquierda.

La prueba cuadrática es similar a la anterior. El método de arreglos anidados consiste en que cada elemento de la estructura contenga otra estructura. 24. ordenados de izquierda a derecha. Esta alternativa genera otro problema mayor. Está generación de direcciones puede llegar a exceder el tamaño de la estructura. 16. una vez que se detecta la colisión. Crear una estructura que almacena 10 elementos que son: 15. La función hash que se aplique para generar la nueva dirección puede no ser la misma a la utilizada en el proceso anterior. lo que permite utilizar cualquiera de las funciones hash conocidas hasta ahora. 71. se eleva al cuadrado y se suma a la dirección inicial (d+1. …. 51.- Arreglos anidados. d+16. controlando en la primera dimensión los elementos iniciales y en la segunda dimensión los colisionados. este proceso se repite hasta que se encuentre una dirección vacía. Generando con esto una estructura con dos dimensiones. d+i2). hasta encontrar un lugar vació. la estructura se debe controlar como una estructura circular. en la cual se almacenen los elementos colisionados. d+4. ¿cuál debe ser el tamaño de la segunda estructura que controla la segunda dimensión? Ejemplo. d+9. y utiliza la función truncamiento tomando los dígitos pares. la dirección inicia en uno y el valor inicial a elevar es el cero. El método de reasignación como su nombre lo indica consiste en reasignar otra dirección de forma alternativa en caso de encontrar una colisión. la generación de la nueva dirección se hace a partir de la dirección previamente obtenida más uno. Doble dirección hash. 13. si es así. Encadenamiento. donde ese valor inicia con el número 1 y lo suma a la dirección que se encuentra en colisión (d+i2). si se genera nuevamente una colisión el valor del número se incrementa. La prueba lineal consiste en recorrer la estructura secuencialmente a partir del punto de colisión. con la diferencia de que la búsqueda de un lugar vació no se hace de forma consecutiva. 22. Prueba cuadrática. donde el siguiente elemento después del último es el primero. para esto no existe una regla establecida. la solución seria la siguiente: Valor 0 1 15 13 16 15 20 Dirección 1 2 . 20. con alguno de los siguientes métodos: Prueba lineal. La doble dirección hash consiste en generar otra dirección hash. se genera a partir de la elevación de un valor al cuadrado. 46 y 69.

ordenados de izquierda a derecha. 71. Como desventaja se puede encontrar que cuando la lista ligada crece demasiado se pierde la facilidad de acceso directo del método hash. 16. 46 y 69. sobre todo con los elementos que generen una colisión. y utiliza la función truncamiento tomando los dígitos pares. la solución seria la siguiente: Valor 0 1 2 3 4 5 6 46 51 69 null null null 15 20 13 24 16 22 null null 15 20 24 51 71 13 16 Dirección 1 2 2 5 7 1 1 . ya que se desperdician demasiados espacios. El método de encadenamiento consiste en que cada posición de la estructura contenga una lista ligada. Ejemplo. 20. la cual crecerá con cada elemento que entre en la estructura. 22. 13.2 20 3 4 46 5 51 6 69 7 71 8 9 24 22 24 51 71 13 16 22 46 69 2 5 7 1 1 2 4 6 Si nos damos cuenta esta solución tiene un gran costo en cuanto a memoria se refiere. 24. 51. Crear una estructura que almacena 10 elementos que son: 15. Este es el método más eficiente debido a que las listas ligadas son dinámicas y evitan tener tantos lugares libres como el método arreglos anidados.

Divide el total de elementos del archivo en dos. los guarde en un archivo. El archivo debe estar ordenado y se debe conocer el número de elementos del mismo para aplicar este método. La búsqueda externa es aquella en la que todos los elementos se encuentran almacenados en un archivo. Ejercicios. El método de búsqueda binaria externa utiliza el mismo principio que la búsqueda binaria interna. una cinta o una memoria usb. el proceso de búsqueda termina cunado el elemento del archivo que se esta comparando es mayor que el que se esta buscando. Crear un programa que genera N números aleatorios. los ordene de forma ascendente y posteriormente aplique la búsqueda secuencial.7 8 9 71 null 22 46 69 2 4 6 Búsqueda externa. Ejercicios. . para determinar si la búsqueda continua del lado izquierdo (menor) o derecho (mayor) del central. el cual se encuentra en un dispositivo de almacenamiento secundario como un disco duro. el proceso de búsqueda debe continuar hasta que se llegue al fin del archivo. en caso de no ser iguales se determina si el elemento buscado es menor o mayor al central. comparando el elemento buscado con el central. Si la búsqueda se aplica a un archivo desordenado y el elemento que se está buscando existe más de una vez. Si la búsqueda se aplica a un archivo ordenado y el elemento que se está buscando existe más de una vez. Los métodos de búsqueda externa más importantes son: Secuencial. repitiendo el mismo proceso de división y comparación. Hash (transformación de claves) Secuencial. los guarde en un archivo y posteriormente aplique la búsqueda secuencial. o hasta llegar al final del archivo. El método de búsqueda secuencial externa consiste en revisar el archivo elemento por elemento hasta encontrar el dato que se esta buscando. Crear un programa que genera N números aleatorios. Binaria. hasta encontrar el elemento buscado o que la división ya no sea posible. Binaria. Este método de búsqueda se puede aplicar a archivos ordenadas o desordenadas.

byte. string.6. Por ejemplo supongamos que tenemos este vector: int vector[10] = {2. por ejemplo. double.4. La clave que queremos buscar es 6. short.16. La sintaxis expresada de forma genérica para realizar este método es la siguiente: Int BinarySearch ([ ] m.20}. sabremos si la búsqueda ha de proceder en la subtabla con la mitad de tamaño que está antes o después de la mitad.10.8. La idea consiste en ir dividiendo el arreglo en mitades. en orden creciente. Si se repite recursivamente el algoritmo al final o bien encontraremos el número sobre una tabla de un sólo elemento o estaremos seguros de que no se encuentra allí.18. flota. es posible utilizar para la búsqueda un algoritmo más eficiente que se basa en un concepto muy utilizado en la programación: dividir para vencer. tipo es cualquier tipo de datos de los siguientes: objet. Se trata de un algoritmo muy eficiente en cuanto el tiempo requerido para realizar una búsqueda es muy pequeño.Ejercicios.14. etc. int.12. los guarde en un archivo y posteriormente aplique la búsqueda binaria Búsqueda Binaria Si la tabla de números está ordenada. Si está ordenada la tabla y miramos el número situado en la mitad para ver si es mayor o menor que el número buscado (o con suerte igual). char. Crear un programa que genera N números aleatorios. tipo clave) Donde m representa la matriz. long. La búsqueda binaria sólo se puede implementar si el arreglo está ordenado. El algoritmo funciona de la siguiente manera . clave es el valor que se desea buscar del mismo tipo que los elementos de la matriz. Este método permite buscar un valor en una matriz que se esta ordenando ascendentemente utilizando el algoritmo de búsqueda binaria.

ComponentModel. Iabajo lo tenemos que subir hasta 6.Collections.Drawing. using System. entonces la parte del arreglo vector*0…5+ ya puede descartarse. using System.Text. using System. using System. namespace busquedabinaria { public partial class Form1 : Form { public int[] num = new int[100]. Reasignamos Iarriba o Iabajo para obtener la nueva parte del arreglo en donde queremos buscar.Se determinan un índice arriba y un índice abajo. en este caso quedaría Icentro = 5. Icentro = (Iarriba + Iabajo)/2. En nuestro caso vector[Icentro] = 5 < 6. Iarriba=0 e Iabajo=10 respectivamente. Iabajo = 6. queda igual ya que sigue siendo el tope. Evaluamos si vector[Icentro] es igual a la clave de búsqueda. using System. Iarriba.Windows. Si son distintos. CODIGO using System. Se determina un índice central. Y volvemos al paso 2.Data. si es igual ya encontramos la clave y devolvemos Icentro. using System. entonces quedaría Iarriba = 10.Forms. evaluamos si vector[Icentro] es mayor o menor que la clave. como el arreglo está ordenado al hacer esto ya podemos descartar una mitad del arreglo asegurándonos que en esa mitad no está la clave que buscamos.Generic. public int x. .

else { if (num[x] > textBox1) Ultimo = Centro .1.public Form1() { InitializeComponent(). EventArgs e) . if (textBox1 != 0) { while ((Primero <= Ultimo) && (Encontrado == false)) { Centro = (Primero + Ultimo) / 2. else Primero = Centro + 1. if ( num[x] == textBox1) Encontrado = true. EventArgs e) { int Primero = 0.Centro = 0. } } } } private void button3_Click(object sender. } private void button1_Click(object sender. Ultimo = N .1.

} } } Búsqueda Binaria La búsqueda binaria consiste en localizar el término buscado comparándolo con la mediana del conjunto de elementos previamente ordenados.{ num[x] = textBox1. dado el siguiente vector: 1 3 5 9 11 12 20 22 30 32 33 35 57 Suponiendo que buscamos el 5. else label2 = "el numero no fue encontrado". Ejemplo. en este caso 9 nos preguntamos si 5 menor igual a 9 como 5 es menor que 9 reducimos el intervalo de búsqueda a los 3 primeros números determinamos la nueva mediana. en este caso 3 nos preguntamos si 5 menor igual a 3 . reduciendo así sucesivamente el intervalo de búsqueda. efectuaremos los siguientes pasos: Determinamos la mediana entre todos los elementos. } private void label2_Click(object sender. en este caso el 20 nos preguntamos si 5 menor igual a 20 como 5 es menor que 20 reducimos el intervalo de búsqueda a los 6 primeros números determinamos la nueva mediana. EventArgs e) { if (Encontrado == false) label2 = "el numero fue encontrado".

hemos terminado nuestra búsqueda A continuación se muestra el diagrama de flujo de Busqueda Binaria suponiendo que buscamos el valor Valor dentro del arreglo X[ ]: .como 5 no es menor que 3 reducimos el intervalo de búsqueda a los números mayores que 3 y menores que 9. en este caso 5 nos preguntamos si 5 menor igual a 5 como 5 es igual a 5. que el es 5 determinamos la nueva mediana de este intervalo. en este caso abarcamos un intervalo de un elemento.

A continuación se muestra un fragmento de código en C correspondiente al diagrama de flujo anterior: . . . .

int alto. else bajo=central+1. bajo=0. alto=N-1. float valor. . .int i. } if(valor==X[central]) printf("El valor se encuentra en la posición %i".bajo.central. . central=(bajo+alto)/2. while(bajo<=alto&&X[central]!=valor) { if(valor<X[central]) alto=central-1. central=(bajo+alto)/2. . . . float X[N]. . else printf("El valor no se encuentra").central).