Вы находитесь на странице: 1из 13

Inicio Libros Tutoriales Eventos Foro Buscar

Libros / Algoritmos de Programacin con Python / Captulo 8. Algoritmos de bsqueda


/ 8.5. Bsqueda binaria

8.5. Bsqueda binaria


Podemos hacer algo mejor? Trataremos de aprovechar el hecho de que la lista est
ordenada y vamos a hacer algo distinto: nuestro espacio de bsqueda se ir achicando a
segmentos cada vez menores de la lista original. La idea es descartar segmentos de la
lista donde el valor seguro que no puede estar:

1. Consideramos como segmento inicial de bsqueda a la lista completa.

2. Analizamos el punto medio del segmento (el valor central), si es el valor buscado,
devolvemos el ndice del punto medio.

3. Si el valor central es mayor al buscado, podemos descartar el segmento que est


desde el punto medio hacia la a derecha.

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
4. Si el valor central es menor al buscado, podemos descartar el segmento que est
desde el punto medio hacia la izquierda.

5. Una vez descartado el segmento que no nos interesa, volvemos a analizar el


segmento restante, de la misma forma.

6. Si en algn momento el segmento a analizar tiene longitud 0 o negativa significa


que el valor buscado no se encuentra en la lista.

Para sealar la porcin del segmento que se est analizando a cada paso, utilizaremos
dos variables ( izq y der ) que contienen la posicin de inicio y la posicin de fin del
segmento que se est considerando. De la misma manera usaremos la varible medio
para contener la posicin del punto medio del segmento.

En el grfico que se incluye a continuacin, vemos qu pasa cuando se busca el valor 18


en la lista [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23] .

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Figura 8.1 Cmo funciona la bsqueda de un elemento dentro del array

Como no se encontr al valor buscado, devuelve 1 . En el Cdigo 8.3 mostramos una


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
posible implementacin de este algoritmo.

A continuacin varias ejecuciones de prueba:

Dame una lista ordenada ([[]] para terminar): [1, 3, 5]


Valor buscado?: 0
DEBUG: izq: 0 der: 2 medio: 1
DEBUG: izq: 0 der: 0 medio: 0
Resultado: -1
Dame una lista ordenada ([[]] para terminar): [1, 3, 5]
Valor buscado?: 1
DEBUG: izq: 0 der: 2 medio: 1
DEBUG: izq: 0 der: 0 medio: 0

Y este es el cdigo fuente:

# Cdigo 8.3: busqueda_binaria.py: Funcin de bsqueda binaria

#!/usr/bin/env python
# encoding: latin1

def busqueda_binaria(lista, x):


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
"""Bsqueda binaria
Precondicin: lista est ordenada
Devuelve -1 si x no est en lista;
Devuelve p tal que lista[p] == x, si x est en lista
"""

# Busca en toda la lista dividindola en segmentos y considerando


# a la lista completa como el segmento que empieza en 0 y termina
# en len(lista) - 1.

izq = 0 # izq guarda el ndice inicio del segmento


der = len(lista) -1 # der guarda el ndice fin del segmento

# un segmento es vaco cuando izq > der:


while izq <= der:
# el punto medio del segmento
medio = (izq+der)/2

print "DEBUG:", "izq:", izq, "der:", der, "medio:", medio

# si el medio es igual al valor buscado, lo devuelve


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
if lista[medio] == x:
return medio

# si el valor del punto medio es mayor que x, sigue buscando


# en el segmento de la izquierda: [izq, medio-1], descartando la
# derecha
elif lista[medio] > x:
der = medio-1

# sino, sigue buscando en el segmento de la derecha:


# [medio+1, der], descartando la izquierda
else:
izq = medio+1
# si no sali del ciclo, vuelve a iterar con el nuevo segmento

# sali del ciclo de manera no exitosa: el valor no fue encontrado


return -1

# Cdigo para probar la bsqueda binaria


def main():
lista = input ("Dame una lista ordenada ([[]] para terminar): ")
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
while lista != [[]]:
x = input("Valor buscado?: ")
resultado = busqueda_binaria(lista, x)
print "Resultado:", resultado
lista = input ("Dame una lista ordenada ([[]] para terminar): ")

main()
Resultado: 0
Dame una lista ordenada ([[]] para terminar): [1, 3, 5]
Valor buscado?: 2
DEBUG: izq: 0 der: 2 medio: 1
DEBUG: izq: 0 der: 0 medio: 0
Resultado: -1
Dame una lista ordenada ([[]] para terminar): [1, 3, 5]
Valor buscado?: 3
DEBUG: izq: 0 der: 2 medio: 1
Resultado: 1
Dame una lista ordenada ([[]] para terminar): [1, 3, 5]
Valor buscado?: 5
DEBUG: izq: 0 der: 2 medio: 1
DEBUG: izq: 2 der: 2 medio: 2

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Resultado: 2
Dame una lista ordenada ([[]] para terminar): [1, 3, 5]
Valor buscado?: 6
DEBUG: izq: 0 der: 2 medio: 1
DEBUG: izq: 2 der: 2 medio: 2
Resultado: -1
Dame una lista ordenada ([[]] para terminar): []
Valor buscado?: 0
Resultado: -1
Dame una lista ordenada ([[]] para terminar): [1]
Valor buscado?: 1
DEBUG: izq: 0 der: 0 medio: 0
Resultado: 0
Dame una lista ordenada ([[]] para terminar): [1]
Valor buscado?: 3
DEBUG: izq: 0 der: 0 medio: 0
Resultado: -1
Dame una lista ordenada ([[]] para terminar): [[]]

8.5.1. Cuntas comparaciones hace este programa?


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Para responder esto pensemos en el peor caso, es decir, que se descartaron varias veces
partes del segmento para finalmente llegar a un segmento vaco y porque el valor
buscado no se encontraba en la lista.

En cada paso el segmento se divide por la mitad y se desecha una de esas mitades, y en
cada paso se hace una comparacin con el valor buscado. Por lo tanto, la cantidad de
comparaciones que hacen con el valor buscado es aproximadamente igual a la cantidad
de pasos necesarios para llegar a un segmento de tamao 1. Veamos el caso ms
sencillo para razonar, y supongamos que la longitud de la lista es una potencia de 2, es
decir len(lista)= 2^k :

Luego del primer paso, el segmento a tratar es de tamao 2^k .

Luego del segundo paso, el segmento a tratar es de tamao 2^(k1) .

Luego del tercer paso, el segmento a tratar es de tamao 2^(k2) .

...

Luego del paso k , el segmento a tratar es de tamao 2^(kk) = 1 .

Por lo tanto este programa hace aproximadamente k comparaciones con el valor


buscado cuando len(lista)= 2^k . Pero si despejamos k de la ecuacin anterior,
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
podemos ver que este programa realiza aproximadamente log2(len(lista))
comparaciones.

Cuando len(lista) no es una potencia de 2 el razonamiento es menos prolijo, pero


tambin vale que este programa realiza aproximadamente log2(len(lista))
comparaciones.

Vemos entonces que si lista es una lista ordenada, la bsqueda binaria es muchsimo
ms eficiente que la bsqueda lineal (por ejemplo, dado que 2^20 es aproximadamente
1.000.000, si lista tiene 1.000.000 de elementos, la bsqueda lineal sobre lista ser
proporcional a 1.000.000, y en promedio har unas 500.000 comparaciones, mientras
que la bsqueda binaria har como mximo 20 comparaciones).

Anterior Siguiente
8.4. Buscar sobre una lista ordenada 8.6. Resumen

Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola, Maximiliano Curia, Marcos Medrano,
Nicols Paez. La copia y redistribucin de esta pgina se permite bajo los trminos de la licencia Creative
Commons Atribucin - Compartir Obras Derivadas Igual 3.0 siempre que se conserve esta nota de copyright.

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
INDICE DE CONTENIDOS
1. Algunos conceptos bsicos

2. Programas sencillos

3. Funciones

4. Decisiones

5. Ms sobre ciclos

6. Cadenas de caracteres

7. Tuplas y listas

Captulo 8. Algoritmos de bsqueda

8.2. Cmo programar la bsqueda lineal a mano

8.3. Bsqueda lineal

8.4. Buscar sobre una lista ordenada

8.5. Bsqueda binaria

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
8.6. Resumen

8.7. Ejercicios

9. Diccionarios

10. Contratos y Mutabilidad

11. Manejo de archivos

12. Manejo de errores y excepciones

13. Procesamiento de archivos

14. Objetos

15. Polimorfismo, Herencia y Delegacin

16. Listas enlazadas

17. Pilas y colas

18. Modelo de ejecucin de funciones y recursividad

19. Ordenar listas

20. Algunos ordenamientos recursivos

3.757
2006-2017 LibrosWeb.es Contacto Novedades Condiciones Privacidad

das online

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com

Вам также может понравиться