Está en la página 1de 18

6.2. Mtodo de bsqueda BINARIA Editar 0 6 a. guadalupe castaeda santiago clara ramirez cruz judith y.

paz lopez nadia m. chavez ruiz leonardo m. vasquez meja

Bsqueda Binaria. La bsqueda binaria es el mtodo ms 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 bsqueda. 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 bsqueda 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. Bsqueda binaria o dicotmica Para utilizar este algoritmo, el array debe estar ordenado. La bsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays ms pequeos, y comparar el elemento con el del centro. Si coinciden, la bsqueda 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 realizaran los siguientes pasos:

Bsqueda Binaria Si la tabla de nmeros est ordenada, por ejemplo, en orden creciente, es posible utilizar para la bsqueda un algoritmo ms eficiente que se basa en un concepto muy utilizado en la programacin: dividir para vencer. Si est ordenada la tabla y miramos el nmero situado en la mitad para ver si es mayor o menor que el nmero buscado (o con suerte igual), sabremos si la bsqueda ha de proceder en la subtabla con la mitad de tamao que est antes o despus de la mitad. Si se repite recursivamente el algoritmo al final o bien encontraremos el nmero sobre una tabla de un slo elemento o estaremos seguros de que no se encuentra all. Este mtodo permite buscar un valor en una matriz que se esta ordenando ascendentemente utilizando el algoritmo de bsqueda binaria. Se trata de un algoritmo muy eficiente en cuanto

el tiempo requerido para realizar una bsqueda es muy pequeo. La sintaxis expresada de forma genrica para realizar este mtodo es la siguiente: Int BinarySearch ([ ] m. tipo clave) Donde m representa la matriz, clave es el valor que se desea buscar del mismo tipo que los elementos de la matriz, tipo es cualquier tipo de datos de los siguientes: objet, string, byte, char, short, int, long, flota, double, etc. La bsqueda binaria slo se puede implementar si el arreglo est ordenado. La idea consiste en ir dividiendo el arreglo en mitades. Por ejemplo supongamos que tenemos este vector: int vector[10] = {2,4,6,8,10,12,14,16,18,20}; La clave que queremos buscar es 6. El algoritmo funciona de la siguiente manera

Se determinan un ndice arriba y un ndice abajo, Iarriba=0 e Iabajo=10 respectivamente. Se determina un ndice central, Icentro = (Iarriba + Iabajo)/2, en este caso quedara Icentro = 5. Evaluamos si vector[Icentro] es igual a la clave de bsqueda, si es igual ya encontramos la clave y devolvemos Icentro. Si son distintos, 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 asegurndonos que en esa mitad no est la clave que buscamos. En nuestro caso vector[Icentro] = 5 < 6, entonces la parte del arreglo vector*05+ ya puede descartarse. Reasignamos Iarriba o Iabajo para obtener la nueva parte del arreglo en donde queremos buscar. Iarriba, queda igual ya que sigue siendo el tope. Iabajo lo tenemos que subir hasta 6, entonces quedara Iarriba = 10, Iabajo = 6. Y volvemos al paso 2.

[[code format="code"]]

namespace busquedabinaria{ public partial class Form1 : Form { public int[] num = new int[100]; public int x; public Form1()

{ InitializeComponent(); }

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

private void button3_Click(object sender, EventArgs e) {

num[x] = textBox1; }

private void label2_Click(object sender, EventArgs e) { if (Encontrado == false) label2 = "el numero fue encontrado"; else label2 = "el numero no fue encontrado"; } } }

6.1 Bsqueda secuencial 6.2 Bsqueda binaria 6.3 Bsqueda por funciones de HASH Mtodos de bsqueda. La bsqueda es la operacin ms importante en el procesamiento de informacin, ya que permite recuperar datos previamente almacenados. El resultado de una bsqueda puede ser un xito, si se encuentra la informacin o un fracaso, si no la encuentra. La bsqueda se puede aplicar sobre elementos previamente ordenados o sobre elementos desordenados, en el primer caso la bsqueda es ms fcil, en cambio en el segundo se dificulta un poco ms el proceso, sobre todo cuando de se trata de encontrar una cantidad de elementos similares. Los mtodos de bsqueda se clasifican en: Bsqueda interna. Bsqueda externa.

Bsqueda interna. La bsqueda interna es aquella en la que todos los elementos de la estructura esttica (arreglo) o dinmica (lista ligada o rbol) se encuentran almacenados en la memoria principal de la computadora.

Los mtodos de bsqueda interna ms importantes son: Secuencial o lineal. Binaria. Hash (transformacin de claves)

Secuencial. El mtodo de bsqueda secuencial consiste en revisar la estructura de datos elemento por elemento hasta encontrar el dato que estamos buscando, o hasta llegar al final de la estructura de datos. Normalmente cuando una funcin de bsqueda concluye con xito, lo que interesa es conocer en qu posicin fue encontrado el elemento buscado. La bsqueda secuencial se puede aplicar a estructuras de datos ordenadas o desordenadas. Si se aplica a una estructura desordenada y el elemento que se est buscando existe ms de una vez en la estructura, el proceso de bsqueda debe continuar hasta que se llegue al fin de la estructura. Ejemplo. Si tenemos una estructura con los elementos 5, 8, 3, 2, 9, 5, 7, 0, 5, 1 y estamos buscando el nmero 5, el resultado de la bsqueda nos mostrara las posiciones 0, 5 y 8 y el proceso terminara al llegar al numero 1 que es el ultimo de la lista de elementos. Elementos Posiciones Posiciones donde encontr el nmero 5 Ejercicio. Crear un programa que aplique una bsqueda secuencial de un dato dentro de un arreglo de elementos desordenados y presenta la o las posiciones donde encontr el dato. 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, ya no es necesario llegar hasta el fin de la estructura. Ejemplo. Si tenemos la estructura anterior pero ordenada 0, 1, 2, 3, 5, 5, 5, 7, 8, 9 y estamos buscando el mismo nmero 5, el resultado de la bsqueda nos mostrara las posiciones 4, 5, y 6, y el proceso terminara ya que el nmero 7 no es menor ni igual al que estamos buscando. 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

encontr el nmero 5 Ejercicio. Crear un programa que aplique una bsqueda secuencial de un dato dentro de un arreglo de elementos ordenados y presenta la o las posiciones donde encontr el dato. Binaria. El mtodo de bsqueda binaria divide el total de los elementos en dos, comparando el elemento buscado con el central, en caso de no ser iguales, se determina si el elemento buscado es menor o mayor al central, para determinar si la bsqueda continua del lado izquierdo (menor) o derecho (mayor) del central, repitiendo el mismo proceso de divisin y comparacin, hasta encontrar el elemento buscado o que la divisin ya no sea posible. Debemos destacar que este mtodo de bsqueda solo funciona con estructuras de datos previamente ordenadas, dividiendo cada vez a la mitad el proceso de bsqueda, lo que hace que el mtodo sea ms eficiente. Ejemplo. Si tenemos una estructura ordenada 0, 1, 2, 3, 5, 5, 5, 7, 8, 9 y estamos buscando el nmero 5, el resultado de la bsqueda nos mostrara la posicione 4 y el proceso terminara ya que el elemento buscado no es diferente al que esta en la posicin central. Elementos Posiciones Posiciones donde i encontr el nmero 5 Este proceso debe sumar la posicin inicial y la final, dividiendo el resultado de la suma entre dos para obtener la posicin central generada por el cociente de la divisin, en este caso es (0+9)/2 = 4, esta posicin se compara con el elemento que estamos buscando y como son iguales la bsqueda se detiene mostrando la posicin donde lo encontr. Ejercicio. Crear un programa que aplique una bsqueda binaria de un dato dentro de un arreglo de elementos ordenados y presenta la posicin donde encontr el dato. Hash. El mtodo de bsqueda hash o por transformacin de clave aumenta la velocidad de bsqueda sin necesidad de que los elementos estn previamente ordenados, comparndolo con los mtodos anteriores. Adems tiene la ventaja de que el tiempo de bsqueda es independiente del nmero de elementos de la estructura que los almacena. Este mtodo permite que el acceso a los datos sea por una llave que indica directamente la posicin donde estn guardados los datos que se buscan. Prcticamente trabaja con una funcin que transforma la llave o dato clave en una direccin (ndice) dentro de la estructura y que en ocasiones puede generar una colisin, que se define como una misma direccin para dos o ms claves distintas. F 0 1 2 3 5 5 5 7 8 9 0 1 2 3 4 5 6 7 8 9

Para trabajar con este mtodo de bsqueda debe elegir previamente dos cosas: Una funcin hash que sea facil de calcular y que distribuya uniformemente las direcciones. Un mtodo para resolver colisiones, generando posiciones alternativas.

Para encontrar la funcin hash no existe una regla que permita determinar cul ser la funcin ms apropiada para generar un conjunto de claves que aseguren la mxima uniformidad en la distribucin de las mismas. Algunas de las funciones hash ms utilizadas son las siguientes: Funcin mdulo (por divisin). Funcin cuadrada. Funcin plegamiento. Funcin truncamiento.

La funcin mdulo o por divisin toma el residuo de la divisin entre la clave y el total de elementos de la estructura, generando la siguiente frmula: direccin = (clave % total elementos) Para lograr una mayor uniformidad en la distribucin de los elementos, se debe buscar que el valor que se usa en el total de elementos sea un nmero primo ms cercano al tamao de la estructura. Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359, las direcciones generadas son las siguientes: direccin = (7259%100) = 59 direccin = (9359%100) = 59 Estos dos casos generan una colisin, ya que los dos nmeros no se pueden asignar dentro de la misma direccin en la estructura, para evitar la colisin, se cambia el valor de 100 por el numero primo ms cercano a l, en este caso seria un 97, lo que generara las siguientes direcciones: direccin = (7259%97) = 81 direccin = (9359%97) = 47 La funcin cuadrada como su nombre lo indica eleva al cuadrado la clave y del resultado, se toman los dgitos centrales como la direccin. El nmero de dgitos a tomar se determina del por el rango del ndice de toda la estructura. La frmula hash es la siguiente: direccin = dgitos centrales (clave2) Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359, las direcciones generadas son las siguientes:

direccin = dgitos centrales (72592) = 52693081 = 93 direccin = dgitos centrales (93592) = 87590881 = 90 Como el rango de claves es de 1 a 100 se toman dos dgitos centrales. La funcin plegamiento divide la clave en partes de igual nmero de dgitos (la ltima puede tener menos dgitos), tomando como direccin los dgitos menos significativos, despus de realizar una operacin entre las partes, ya sea una serie de sumas o de multiplicaciones. La frmula seria la siguiente: direccin = dgitos menos significativos (suma de partes) direccin = dgitos menos significativos (multiplicacin de partes) Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359, las direcciones generadas son las siguientes: direccin = dgitos menos significativos (72 + 59) = dgitos menos significativos (131) = 31 direccin = dgitos menos significativos (93 + 59) = dgitos menos significativos (152) = 52 Como el rango de claves es de 1 a 100 se toman dos dgitos para las particiones y para la direccin. La funcin truncamiento toma algunos de los dgitos de las claves y forma con ellos una direccin. La eleccin de los dgitos es arbitraria, podran tomarse los de las posiciones pares o impares para con ellos generar la direccin donde se almacenara la clave, uniendo los dgitos de izquierda a derecha o de derecha a izquierda, su frmula es la siguiente: direccin = elegir dgitos (unin dgitos) Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y 9359, las direcciones generadas son las siguientes: direccin = elegir dgitos (7, 5) = 75 direccin = elegir dgitos (9, 5) = 95 Para este caso se tomaron los dgitos impares y se unieron de izquierda a derecha. Un mtodo para la solucin de colisiones es tan importante como la funcin hash, este mtodo debe entrar en operacin cuando la funcin hash asigna la misma direccin a dos o mas claves diferentes. Algunos de los mtodos para la solucin de colisiones ms utilizados son: Reasignacin.

Arreglos anidados. Encadenamiento.

El mtodo de reasignacin como su nombre lo indica consiste en reasignar otra direccin de forma alternativa en caso de encontrar una colisin, con alguno de los siguientes mtodos: Prueba lineal. Prueba cuadrtica. Doble direccin hash.

La prueba lineal consiste en recorrer la estructura secuencialmente a partir del punto de colisin, hasta encontrar un lugar vaci, la estructura se debe controlar como una estructura circular, donde el siguiente elemento despus del ltimo es el primero. La prueba cuadrtica es similar a la anterior, con la diferencia de que la bsqueda de un lugar vaci no se hace de forma consecutiva, se genera a partir de la elevacin de un valor al cuadrado, donde ese valor inicia con el nmero 1 y lo suma a la direccin que se encuentra en colisin (d+i2), si se genera nuevamente una colisin el valor del nmero se incrementa, se eleva al cuadrado y se suma a la direccin inicial (d+1, d+4, d+9, d+16, , d+i2), este proceso se repite hasta que se encuentre una direccin vaca. Est generacin de direcciones puede llegar a exceder el tamao de la estructura, si es as, la direccin inicia en uno y el valor inicial a elevar es el cero. La doble direccin hash consiste en generar otra direccin hash, una vez que se detecta la colisin, la generacin de la nueva direccin se hace a partir de la direccin previamente obtenida ms uno. La funcin hash que se aplique para generar la nueva direccin puede no ser la misma a la utilizada en el proceso anterior, para esto no existe una regla establecida, lo que permite utilizar cualquiera de las funciones hash conocidas hasta ahora. El mtodo de arreglos anidados consiste en que cada elemento de la estructura contenga otra estructura, en la cual se almacenen los elementos colisionados. Generando con esto una estructura con dos dimensiones, controlando en la primera dimensin los elementos iniciales y en la segunda dimensin los colisionados. Esta alternativa genera otro problema mayor, cul debe ser el tamao de la segunda estructura que controla la segunda dimensin? Ejemplo. Crear una estructura que almacena 10 elementos que son: 15, 20, 24, 51, 71, 13, 16, 22, 46 y 69, y utiliza la funcin truncamiento tomando los dgitos pares, ordenados de izquierda a derecha, la solucin seria la siguiente:

Valor 0 1 15 13 16 15 20

Direccin 1 2

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 solucin tiene un gran costo en cuanto a memoria se refiere, ya que se desperdician demasiados espacios. El mtodo de encadenamiento consiste en que cada posicin de la estructura contenga una lista ligada, la cual crecer con cada elemento que entre en la estructura, sobre todo con los elementos que generen una colisin. Este es el mtodo ms eficiente debido a que las listas ligadas son dinmicas y evitan tener tantos lugares libres como el mtodo arreglos anidados. Como desventaja se puede encontrar que cuando la lista ligada crece demasiado se pierde la facilidad de acceso directo del mtodo hash. Ejemplo. Crear una estructura que almacena 10 elementos que son: 15, 20, 24, 51, 71, 13, 16, 22, 46 y 69, y utiliza la funcin truncamiento tomando los dgitos pares, ordenados de izquierda a derecha, la solucin 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

Direccin 1 2 2 5 7 1 1

7 8 9

71

null

22 46 69

2 4 6

Bsqueda externa. La bsqueda externa es aquella en la que todos los elementos se encuentran almacenados en un archivo, el cual se encuentra en un dispositivo de almacenamiento secundario como un disco duro, una cinta o una memoria usb. Los mtodos de bsqueda externa ms importantes son: Secuencial. Binaria. Hash (transformacin de claves)

Secuencial. El mtodo de bsqueda secuencial externa consiste en revisar el archivo elemento por elemento hasta encontrar el dato que se esta buscando, o hasta llegar al final del archivo. Este mtodo de bsqueda se puede aplicar a archivos ordenadas o desordenadas. Si la bsqueda se aplica a un archivo desordenado y el elemento que se est buscando existe ms de una vez, el proceso de bsqueda debe continuar hasta que se llegue al fin del archivo. Ejercicios. Crear un programa que genera N nmeros aleatorios, los guarde en un archivo y posteriormente aplique la bsqueda secuencial. Si la bsqueda se aplica a un archivo ordenado y el elemento que se est buscando existe ms de una vez, el proceso de bsqueda termina cunado el elemento del archivo que se esta comparando es mayor que el que se esta buscando. Ejercicios. Crear un programa que genera N nmeros aleatorios, los guarde en un archivo, los ordene de forma ascendente y posteriormente aplique la bsqueda secuencial. Binaria. El mtodo de bsqueda binaria externa utiliza el mismo principio que la bsqueda binaria interna. Divide el total de elementos del archivo en dos, comparando el elemento buscado con el central, en caso de no ser iguales se determina si el elemento buscado es menor o mayor al central, para determinar si la bsqueda continua del lado izquierdo (menor) o derecho (mayor) del central, repitiendo el mismo proceso de divisin y comparacin, hasta encontrar el elemento buscado o que la divisin ya no sea posible. El archivo debe estar ordenado y se debe conocer el nmero de elementos del mismo para aplicar este mtodo.

Ejercicios. Crear un programa que genera N nmeros aleatorios, los guarde en un archivo y posteriormente aplique la bsqueda binaria

Bsqueda Binaria

Si la tabla de nmeros est ordenada, por ejemplo, en orden creciente, es posible utilizar para la bsqueda un algoritmo ms eficiente que se basa en un concepto muy utilizado en la programacin: dividir para vencer.

Si est ordenada la tabla y miramos el nmero situado en la mitad para ver si es mayor o menor que el nmero buscado (o con suerte igual), sabremos si la bsqueda ha de proceder en la subtabla con la mitad de tamao que est antes o despus de la mitad. Si se repite recursivamente el algoritmo al final o bien encontraremos el nmero sobre una tabla de un slo elemento o estaremos seguros de que no se encuentra all.

Este mtodo permite buscar un valor en una matriz que se esta ordenando ascendentemente utilizando el algoritmo de bsqueda binaria. Se trata de un algoritmo muy eficiente en cuanto el tiempo requerido para realizar una bsqueda es muy pequeo. La sintaxis expresada de forma genrica para realizar este mtodo es la siguiente:

Int BinarySearch ([ ] m. tipo clave)

Donde m representa la matriz, clave es el valor que se desea buscar del mismo tipo que los elementos de la matriz, tipo es cualquier tipo de datos de los siguientes: objet, string, byte, char, short, int, long, flota, double, etc.

La bsqueda binaria slo se puede implementar si el arreglo est ordenado. La idea consiste en ir dividiendo el arreglo en mitades. Por ejemplo supongamos que tenemos este vector:

int vector[10] = {2,4,6,8,10,12,14,16,18,20};

La clave que queremos buscar es 6. El algoritmo funciona de la siguiente manera

Se determinan un ndice arriba y un ndice abajo, Iarriba=0 e Iabajo=10 respectivamente. Se determina un ndice central, Icentro = (Iarriba + Iabajo)/2, en este caso quedara Icentro = 5. Evaluamos si vector[Icentro] es igual a la clave de bsqueda, si es igual ya encontramos la clave y devolvemos Icentro. Si son distintos, 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 asegurndonos que en esa mitad no est la clave que buscamos. En nuestro caso vector[Icentro] = 5 < 6, entonces la parte del arreglo vector*05+ ya puede descartarse. Reasignamos Iarriba o Iabajo para obtener la nueva parte del arreglo en donde queremos buscar. Iarriba, queda igual ya que sigue siendo el tope. Iabajo lo tenemos que subir hasta 6, entonces quedara Iarriba = 10, Iabajo = 6. Y volvemos al paso 2.

CODIGO

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;

namespace busquedabinaria { public partial class Form1 : Form { public int[] num = new int[100]; public int x;

public Form1() { InitializeComponent(); }

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

private void button3_Click(object sender, EventArgs e)

{ num[x] = textBox1; }

private void label2_Click(object sender, EventArgs e) { if (Encontrado == false) label2 = "el numero fue encontrado"; else label2 = "el numero no fue encontrado"; } } } Bsqueda Binaria La bsqueda binaria consiste en localizar el trmino buscado comparndolo con la mediana del conjunto de elementos previamente ordenados, reduciendo as sucesivamente el intervalo de bsqueda. Ejemplo, dado el siguiente vector: 1 3 5 9 11 12 20 22 30 32 33 35 57 Suponiendo que buscamos el 5, efectuaremos los siguientes pasos: Determinamos la mediana entre todos los elementos, en este caso el 20 nos preguntamos si 5 menor igual a 20 como 5 es menor que 20 reducimos el intervalo de bsqueda a los 6 primeros nmeros determinamos la nueva mediana, en este caso 9 nos preguntamos si 5 menor igual a 9 como 5 es menor que 9 reducimos el intervalo de bsqueda a los 3 primeros nmeros determinamos la nueva mediana, en este caso 3 nos preguntamos si 5 menor igual a 3

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

A continuacin se muestra un fragmento de cdigo en C correspondiente al diagrama de flujo anterior: . . .

int i; float valor; float X[N]; int alto,central,bajo; . . . bajo=0; alto=N-1; central=(bajo+alto)/2;

while(bajo<=alto&&X[central]!=valor) { if(valor<X[central]) alto=central-1; else bajo=central+1; central=(bajo+alto)/2; } if(valor==X[central]) printf("El valor se encuentra en la posicin %i",central); else printf("El valor no se encuentra"); . . .

También podría gustarte