Algoritmo de Búsqueda Binaria

7
Algoritmo de Búsqueda Binaria Un algoritmo de búsqueda binaria (o corte binario) es una función para buscar un valor particular en un arreglo ordenado. Eliminando la mitad de los datos en cada paso. La búsqueda binaria encuentra la media, compara y determina si el valor se encuentra en esa posición o esta antes o después. Una Búsqueda Binaria es un ejemplo de la técnica “Divide y Conquista” (o mejor dicho “Decrece y Conquista”). Algoritmo Iterativo int búsqueda_binaria(vector <int> list, int val){ int der = list.size() - 1, izq = 0, m; while(izq <= der){ m = (izq + der) / 2; if(m == list[val]) return m; //la posición del valor if(m > list[val]) der = m – 1; else izq = m + 1; } return -1; // no se encontro el dato :P } Algoritmo Recursivo // en este algoritmo se llema la funcion como sigue // pos = bb_rec(list, 0, list.size() - 1); int bb_rec(vector <int> list, int izq, int der int val){ int m = (izq + der) / 2; if(izq > der) return -1; // no se encontro if(list[m] == val) return m; if(list[m] < val) return bb_rec(list, m + 1, der, val); return bb_rec(list, izq, m – 1 , val); } Por ejemplo: si se quiere buscar el 10 en el siguiente arreglo: 3 5 10 15 21 50 100 1564 1565 10000 0 Paso 1: La búsqueda binaria busca la mitad: 3 5 10 15 21 50 100 1564 1565 10000 0 Si es el resultado devuelve su posición, en otro caso busca de que lado esta el valor, y desecha la mitad del arreglo Paso 2: busca la mitad. 3 5 10 15

description

lista

Transcript of Algoritmo de Búsqueda Binaria

Page 1: Algoritmo de Búsqueda Binaria

Algoritmo de Búsqueda BinariaUn algoritmo de búsqueda binaria (o corte binario) es una función para buscar un valor particular en un arreglo ordenado. Eliminando la mitad de los datos en cada paso. La búsqueda binaria encuentra la media, compara y determina si el valor se encuentra en esa posición o esta antes o después. Una Búsqueda Binaria es un ejemplo de la técnica “Divide y Conquista” (o mejor dicho “Decrece y Conquista”).

Algoritmo Iterativo

int búsqueda_binaria(vector <int> list, int val){   int der = list.size() - 1, izq = 0, m;   while(izq <= der){      m = (izq + der) / 2;      if(m == list[val]) return m; //la posición del valor      if(m > list[val]) der = m – 1;      else izq = m + 1;   }     return -1; // no se encontro el dato :P}

Algoritmo Recursivo

// en este algoritmo se llema la funcion como sigue// pos = bb_rec(list, 0, list.size() - 1);

int bb_rec(vector <int> list, int izq, int der int val){   int m = (izq + der) / 2;   if(izq > der) return -1; // no se encontro   if(list[m] == val) return m;   if(list[m] < val) return bb_rec(list, m + 1, der, val);   return bb_rec(list, izq, m – 1 , val);}

Por ejemplo: si se quiere buscar el 10 en el siguiente arreglo:

3 5 10 15 21 50 100 1564 1565 100000

              Paso 1: La búsqueda binaria busca la mitad:

3 5 10 15 21 50 100 1564 1565 100000

Si es el resultado devuelve su posición, en otro caso busca de que lado esta el valor, y desecha la mitad del arregloPaso 2: busca la mitad.

3 5 10 15

Si es el resultado devuelve su posición, en otro caso busca de que lado esta el valor, y desecha la mitad del arreglo

Page 2: Algoritmo de Búsqueda Binaria

Paso 3: busca la mitad.

10 15

Como se encontró el resultado, se regresa su posición que es la 3.

La complejidad de la búsqueda binaria de O( log2 n ).

Por ejemplo si se quiere buscar un numero en un arreglo de 1,000,000 de números, la búsqueda binaria solo requerirá 20 pasos para encontrar el valor o determinar que no existe en el arreglo.

Nota: Recordemos que el arreglo debe estar ordenado para poder aplicar este algoritmo.

Extensión de Búsqueda binaria.    La búsqueda binaria no tan solo nos sirve para encontrar un número en un arreglo ordenado, si no también para determinar, soluciones a problemas que su respuestas van creciendo.

Por ejemplo con una búsqueda binaria podríamos saber cual es el valor que debe tener x, para que  y = 2x sea igual a 1.3, solamente modificando alguna parte del código.

Ordenamiento Burbuja (Bubblesort)^

1. Descripción.^

Este es el algoritmo más sencillo probablemente. Ideal para empezar. Consiste en ciclar repetidamente a través de la lista, comparando elementos adyacentes de dos en dos. Si un elemento es mayor que el que está en la siguiente posición se intercambian. ¿Sencillo no?

2. Pseudocódigo en C.^

Tabla de variables

Nombre Tipo Uso

lista Cualquiera Lista a ordenar

TAM Constante entera Tamaño de la lista

i Entero Contador

j Entero Contador

temp El mismo que los elementos de la lista Para realizar los intercambios

1. for (i=1; i<TAM; i++) 2. for j=0 ; j<TAM - 1; j++) 3. if (lista[j] > lista[j+1]) 4. temp = lista[j]; 5. lista[j] = lista[j+1]; 6. lista[j+1] = temp; 3. Un ejemplo^

Vamos a ver un ejemplo. Esta es nuestra lista:

4 - 3 - 5 - 2 - 1

Tenemos 5 elementos. Es decir, TAM toma el valor 5. Comenzamos comparando el primero con el segundo elemento. 4 es mayor que 3, así que intercambiamos. Ahora tenemos:

Page 3: Algoritmo de Búsqueda Binaria

3 - 4 - 5 - 2 - 1

Ahora comparamos el segundo con el tercero: 4 es menor que 5, así que no hacemos nada. Continuamos con el tercero y el cuarto: 5 es mayor que 2. Intercambiamos y obtenemos:

3 - 4 - 2 - 5 - 1

Comparamos el cuarto y el quinto: 5 es mayor que 1. Intercambiamos nuevamente:

3 - 4 - 2 - 1 - 5

Repitiendo este proceso vamos obteniendo los siguientes resultados:

3 - 2 - 1 - 4 - 5

2 - 1 - 3 - 4 - 5

1 - 2 - 3 - 4 - 5

4. Optimizando.^

Se pueden realizar algunos cambios en este algoritmo que pueden mejorar su rendimiento.

Si observas bien, te darás cuenta que en cada pasada a través de la lista un elemento va quedando en su posición final. Si no te queda claro mira el ejemplo de arriba. En la primera pasada el 5 (elemento mayor) quedó en la última posición, en la segunda el 4 (el segundo mayor elemento) quedó en la penúltima posición. Podemos evitar hacer comparaciones innecesarias si disminuimos el número de éstas en cada pasada. Tan sólo hay que cambiar el ciclo interno de esta manera:

for (j=0; j<TAM - i; j++) Puede ser que los datos queden ordenados antes de completar el ciclo externo.

Podemos modificar el algoritmo para que verifique si se han realizado intercambios. Si no se han hecho entonces terminamos con la ejecución, pues eso significa que los datos ya están ordenados. Te dejo como tarea que modifiques el algoritmo para hacer esto :-).

Otra forma es ir guardando la última posición en que se hizo un intercambio, y en la siguiente pasada sólo comparar hasta antes de esa posición.

5. Análisis del algoritmo.^

Éste es el análisis para la versión no optimizada del algoritmo:

Estabilidad : Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es estable.

Requerimientos de Memoria : Este algoritmo sólo requiere de una variable adicional para realizar los intercambios.

Tiempo de Ejecución : El ciclo interno se ejecuta n veces para una lista de n elementos. El ciclo externo también se ejecuta n veces. Es decir, la complejidad es n * n = O(n2). El comportamiento del caso promedio depende del orden de entrada de los datos, pero es sólo un poco mejor que el del peor caso, y sigue siendo O(n2).

Ventajas:

Fácil implementación.

No requiere memoria adicional.

Desventajas:

Muy lento.

Realiza numerosas comparaciones.

Realiza numerosos intercambios.

Page 4: Algoritmo de Búsqueda Binaria

Este algoritmo es uno de los más pobres en rendimiento. Si miras la demostración te darás cuenta de ello. No es recomendable usarlo. Tan sólo está aquí para que lo conozcas, y porque su sencillez lo hace bueno para empezar. Ya veremos otros mucho mejores. Ahora te recomiendo que hagas un programa y lo pruebes. Si tienes dudas mira el programa de ejemplo.

Merge Sort es un algoritmo recursivo para ordenar los elementos de un vector.

Primero se divide el vector en dos partes iguales.

Después se ordenan las dos partes recursivamente.

Finalmente se combinan las dos partes ordenadas para obtener el resultado.

Page 5: Algoritmo de Búsqueda Binaria

MERGESORT

Este algoritmo fue desarrollado por el matemático húngaro John Von Neumann en 1945.

[Thomas Cormen, 2001].

Consiste en dividir en dos partes iguales el vector a ordenar, ordenar por separado cada una de las partes, y luego mezclar ambas partes, manteniendo el orden, en un solo vector ordenado.

El algoritmo MergeSort (u Ordenamiento por mezcla) es un algoritmo que sirve para ordenar secuencias de datos.

Utiliza los siguientes tres pasos:DIVIDIR: divide la secuencia de "n" elementos a ordenar en dos subsecuencias de "n/2" elementos cada una.VENCER: ordena las dos subsecuencias de manera recursiva mediante el algoritmo MERGESORT.COMBINAR: combina las dos subsecuencias ordenadas para generar la solución.ANÁLISIS

CoMo cualquiera de los algoritmos de ordenamiento recursivo tiene complejidad logarítmica: O(n log2n).

Si el tiempo de ordenamiento de MergeSort para una lista de n elementos es T(n) entonces la repetición T(n) = 2T( n/2 ) + n sigue de la definición del algoritmo (Aplicar el algoritmo a las dos listas de la mitad del tamaño de la lista original y aumentar los n pasos tomados para utilizar MergeSort en las dos listas resultantes).

CARACTERISTICAS:

La eficiencia de este algoritmo es bastante notable en tiempo de ejecución en comparación con otros, ya que su manera de trabajo por grupos pequeños agiliza la organización de los datos.

Page 6: Algoritmo de Búsqueda Binaria

Su utilización se da con mucha frecuencia cuando la cantidad de registros no es muy grande ya que para hacer las mezclas éste método utiliza el doble del espacio que gasta el arreglo original de valores.Este es un algoritmo estable (no intercambia los registros con claves iguales) dependiendo de la forma en que se implemente, recursivo y por tanto de complejidad O(n log2n) tanto en el peor caso como en el mejor o en el caso promedio pues el tiempo que emplea no depende de la disposición inicial de los datosVENTAJAS

A diferencia de algunas versiones mejoradas del QuickSort, MergeSort es un método estable de ordenamiento mientras la operación de mezcla (Merge) sea implementada correctamente.

Una gran ventaja del MergeSort es que su algoritmo tiene mucha estabilidad (se evitan los problemas de intercambio de claves en la manipulación de datos). En la gestión de Bases de Datos se utiliza comúnmente cuando la cantidad de registros en el índice es relativamente baja, ya que en caso contrario es poco productivo debido a que gasta el doble de espacio del que ocupan inicialmente los datos.Este algoritmo es efectivo para conjuntos de datos que se puedan acceder secuencialmente como arreglos, vectores y listas ligadasDESVENTAJAS

Su principal desventaja radica en que está definido recursivamente y su implementación no recursiva emplea una pila, por lo que requiere un espacio adicional de memoria para almacenarla.A los algoritmos que realizan el proceso de ordenamiento dentro del mismo vector se les denomina algoritmos de ordenamiento "in-situ", el algoritmo de MergeSort no pertenece a esta familia ya que no utiliza el espacio sobre el que están almacenados los datos sino que para poder funcionar requiere de un espacio de memoria adicional del tamaño de los datos a ordenar en el cual se realicen las mezclas