• No se han encontrado resultados

Algoritmos de búsqueda. Introducción a la programación

N/A
N/A
Protected

Academic year: 2022

Share "Algoritmos de búsqueda. Introducción a la programación"

Copied!
32
0
0

Texto completo

(1)

Algoritmos de búsqueda

Introducción a la programación

I semestre, 2016

(2)

Agenda

Algoritmos de búsqueda

Secuencial

Binaria

comparación

(3)

Algoritmos de Búsqueda

La búsqueda de un elemento determinado en un conjunto de datos es un algoritmo básico para la construcción de una gran cantidad de soluciones:

¿cómo encuentro el número de teléfono de un contacto X en mi celular?

Búsqueda en el web como google.com o duckduckgo.com

Algunas características de la forma en la cual están organizados los datos (en la

estructura de datos) podarían ser relevantes para determinar el algoritmo a utilizar, a saber:

¿están ordenados?

Sin orden: se debe realizar una búsqueda secuencial o lineal por toda la lista hasta encontrar el elemento buscado o sino hasta que se llegue al final se podrá asegurar que no existe.

Ordenados: se pueden utilizar otros algoritmos de búsqueda más eficientes como

búsqueda binaria.

(4)

Algoritmos de búsqueda: secuencial

Búsqueda secuencial o lineal

Consiste en recorrer de forma secuencial (paso a paso) todos los elementos de la lista hasta encontrar el buscado.

Implementación en python:

Entradas: una lista (¿lista?, ¿vector?, ¿matriz?) y el elemento buscado (elem)

Salidas: posición de elem o una excepción (o mensaje de error) ¿cual?

Ojo: la lista NO se destruye, se recorre.

def busqueda_secuencial(lista, elem):

(5)

Algoritmos de búsqueda: secuencial

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

Buscando el elemento 7

(6)

Algoritmos de Búsqueda: secuencial

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1

8

4

4

11

6

9

8

5

7

Buscando el elemento 7

(7)

Algoritmos de Búsqueda: secuencial

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7 Buscando el elemento 307

1

8

4

4

11

6

9

8

5

7

(8)

Algoritmos de Búsqueda: secuencial

def busqueda_secuencial(lista, elem):

return busqueda_secuencial_aux(lista, elem, 0, len(lista))

def busqueda_secuencial_aux(lista, elem, indice, largo):

if indice == largo:

return -1

elif lista[indice] == elem:

return indice else:

return busqueda_secuencial_aux(lista, elem, indice+1, largo)

→ y ¿de forma iterativa?

(9)

Algoritmos de Búsqueda: binaria

Búsqueda binaria

Consiste en hacer más pequeño el espacio de búsqueda en cada iteración

De la misma forma que hacemos cuando buscamos una palabra en un diccionarios.

Lo cual agrega como requisito fundamental para la búsqueda que los elementos estén ordenados

Algoritmo: (asumiendo una lista ordenada ascendentemente)

Se revisa si el elemento buscado es igual al elemento que esté en la mitad del espacio de búsqueda, si es igual se retorna y si no se define un nuevo espacio de búsqueda

El nuevo espacio de búsqueda se define en base a determinar si el elemento buscado es:

mayor que el elemento en la mitad, entonces ahora se buscará de la misma forma pero solo entre los elementos ubicados entre la mitad y el final de la lista.

Menor que el elemento en la mitad, entonces ahora se buscará de la misma forma pero solo

entre los elementos ubicados entre el inicio de la lista y la mitad.

(10)

Algoritmos de Búsqueda: binaria

Búsqueda binaria

Algoritmo: asumiendo una lista ordenada ascendentemente y usando un lenguaje más propio de pseudocódigo...

Conceptos, variables y parámetros:

Espacio de búsqueda: una lista o sublista en la cual se buscará un elemento.

Elemento: el valor a buscar en el espacio de búsqueda.

Inicio: índice del primero elemento del espacio de búsqueda

Final: largo de la lista

Mitad: un índice dentro de la lista que se calcula: (inicio + final) // 2

Se revisa si elemento está en la mitad del espacio de búsqueda:

si es igual se retorna mitad.

si no se define un nuevo espacio de búsqueda y intenta de nuevo

Nuevo espacio de búsqueda:

Si elemento es mayor que mitad entonces inicio = mitad + 1 y final = final.

Si elemento es menor que mitad entonces inicio = inicio y final = mitad - 1

Implementación en python ?

def busqueda_binaria(lista, elem):

#hacer implementación

(11)

Algoritmos de Búsqueda: binaria

1 2 3 4 5 6 7 8 9 10

i: 0, f: 10 mitad: [5]

1 2 3 4 5 6 7 88 9 10

i: 6, f: 10 mitad: [8]

1 2 3 4 5 6 7 8 9 10

i: 6, f: 7 mitad: [6]

Buscando el elemento 7

(12)

Algoritmos de Búsqueda: binaria

1 2 3 4 5 6 7 8 9 10

i: 0, f: 10 mitad: [5]

1 2 3 4 5 6 7 8 9 10

i: 6, f: 10 mitad: [8]

1 2 3 4 5 6 7 8 9 10

i: 9, f: 10 mitad: [9]

Buscando el elemento 307

1 2 3 4 5 6 7 8 9 10

i: 10, f: 10

mitad: -

(13)

Búsqueda binaria

def busqueda_binaria(lista, elem):

return busqueda_binaria_aux(lista, elem, 0, len(lista))

def busqueda_binaria_aux(lista, elem, inicial, final):

if final < inicial or inicial == len(lista):

Return -1

mitad = (inicial + final) // 2 if lista[mitad] == elem:

return mitad

elif lista[mitad] > elem:

return busqueda_binaria_aux(lista, elem, inicial, mitad - 1) else:

return busqueda_binaria_aux(lista, elem, mitad + 1, final)

(14)

Algoritmos de Búsqueda: Comparaciones

Búsqueda secuencial

Problemas: siempre se recorre toda la lista.

Eficiencia: es directamente proporcional a la cantidad de elementos de la lista. En el peor de los casos se recorre toda.

Búsqueda binaria

Problemas: la lista debe estar ordenada.

Eficiencia: Es mucho más rápida que la búsqueda secuencial, en el peor de los

casos se recorre el largo de la lista / 2.

(15)

Referencias y Lecturas Complementarias

Material suministrado por el profesor Jeff Schmidt, Instituto Tecnológico de Costa Rica. I semestre 2011.

J. Helo Guzmán, Introducción a la programación con Scheme, Segunda ed. Cartago:

Editorial tecnológica, 2005.

J. Solano, Introducción a la programación en Python, Primera ed. Cartago: Editorial tecnológica, 2011.

En general: http://docs.python.org/3/

(16)

17

Las presentaciones para el curso IC-1800:

"Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir

Igual 3.0 Costa Rica.

http://creativecommons.org/licenses/by-sa/3.0/cr/ http://creativecommons.org/licenses/by-sa/3.0/cr/

*La licencia de la presentación no cubre las imágenes utilizadas*

(17)

Algoritmos de búsqueda

Introducción a la programación

I semestre, 2016

(18)

Agenda

Algoritmos de búsqueda

Secuencial

Binaria

comparación

(19)

Algoritmos de Búsqueda

La búsqueda de un elemento determinado en un conjunto de datos es un algoritmo básico para la construcción de una gran cantidad de soluciones:

¿cómo encuentro el número de teléfono de un contacto X en mi celular?

Búsqueda en el web como google.com o duckduckgo.com

Algunas características de la forma en la cual están organizados los datos (en la estructura de datos) podarían ser relevantes para determinar el algoritmo a utilizar, a saber:

¿están ordenados?

Sin orden: se debe realizar una búsqueda secuencial o lineal por toda la lista hasta encontrar el elemento buscado o sino hasta que se llegue al final se podrá asegurar que no existe.

Ordenados: se pueden utilizar otros algoritmos de búsqueda más eficientes como búsqueda binaria.

(20)

Algoritmos de búsqueda: secuencial

Búsqueda secuencial o lineal

Consiste en recorrer de forma secuencial (paso a paso) todos los elementos de la lista hasta encontrar el buscado.

Implementación en python:

Entradas: una lista (¿lista?, ¿vector?, ¿matriz?) y el elemento buscado (elem)

Salidas: posición de elem o una excepción (o mensaje de error) ¿cual?

Ojo: la lista NO se destruye, se recorre.

def busqueda_secuencial(lista, elem):

(21)

Algoritmos de búsqueda: secuencial

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

Buscando el elemento 7

Se encuentra en la posición [6] de la lista luego de 7

intentos de búsqueda.

(22)

Algoritmos de Búsqueda: secuencial

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7 Buscando el elemento 7

Se encuentra en la posición [9] de la

lista luego de 10 intentos de búsqueda.

(23)

Algoritmos de Búsqueda: secuencial

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7

1 8 4 4 11 6 9 8 5 7 Buscando el elemento 307

1 8 4 4 11 6 9 8 5 7

No existe, luego de 10 intentos de

búsqueda.

(24)

Algoritmos de Búsqueda: secuencial

def busqueda_secuencial(lista, elem):

return busqueda_secuencial_aux(lista, elem, 0, len(lista))

def busqueda_secuencial_aux(lista, elem, indice, largo):

if indice == largo:

return -1

elif lista[indice] == elem:

return indice else:

return busqueda_secuencial_aux(lista, elem, indice+1, largo)

→ y ¿de forma iterativa?

(25)

Algoritmos de Búsqueda: binaria

Búsqueda binaria

Consiste en hacer más pequeño el espacio de búsqueda en cada iteración

De la misma forma que hacemos cuando buscamos una palabra en un diccionarios.

Lo cual agrega como requisito fundamental para la búsqueda que los elementos estén ordenados

Algoritmo: (asumiendo una lista ordenada ascendentemente)

Se revisa si el elemento buscado es igual al elemento que esté en la mitad del espacio de búsqueda, si es igual se retorna y si no se define un nuevo espacio de búsqueda El nuevo espacio de búsqueda se define en base a determinar si el elemento buscado es:

mayor que el elemento en la mitad, entonces ahora se buscará de la misma forma pero solo entre los elementos ubicados entre la mitad y el final de la lista.

Menor que el elemento en la mitad, entonces ahora se buscará de la misma forma pero solo entre los elementos ubicados entre el inicio de la lista y la mitad.

(26)

Algoritmos de Búsqueda: binaria

Búsqueda binaria

Algoritmo: asumiendo una lista ordenada ascendentemente y usando un lenguaje más propio de pseudocódigo...

Conceptos, variables y parámetros:

Espacio de búsqueda: una lista o sublista en la cual se buscará un elemento.

Elemento: el valor a buscar en el espacio de búsqueda.

Inicio: índice del primero elemento del espacio de búsqueda

Final: largo de la lista

Mitad: un índice dentro de la lista que se calcula: (inicio + final) // 2

Se revisa si elemento está en la mitad del espacio de búsqueda:

si es igual se retorna mitad.

si no se define un nuevo espacio de búsqueda y intenta de nuevo Nuevo espacio de búsqueda:

Si elemento es mayor que mitad entonces inicio = mitad + 1 y final = final.

Si elemento es menor que mitad entonces inicio = inicio y final = mitad - 1

Implementación en python ?

def busqueda_binaria(lista, elem):

#hacer implementación

(27)

Algoritmos de Búsqueda: binaria

1 2 3 4 5 6 7 8 9 10 i: 0, f: 10 mitad: [5]

1 2 3 4 5 6 7 88 9 10 i: 6, f: 10 mitad: [8]

1 2 3 4 5 6 7 8 9 10 i: 6, f: 7 mitad: [6]

Buscando el elemento 7

(28)

Algoritmos de Búsqueda: binaria

1 2 3 4 5 6 7 8 9 10 i: 0, f: 10 mitad: [5]

1 2 3 4 5 6 7 8 9 10 i: 6, f: 10 mitad: [8]

1 2 3 4 5 6 7 8 9 10 i: 9, f: 10 mitad: [9]

Buscando el elemento 307

1 2 3 4 5 6 7 8 9 10

i: 10, f: 10 mitad: -

(29)

Búsqueda binaria

def busqueda_binaria(lista, elem):

return busqueda_binaria_aux(lista, elem, 0, len(lista))

def busqueda_binaria_aux(lista, elem, inicial, final):

if final < inicial or inicial == len(lista):

Return -1

mitad = (inicial + final) // 2 if lista[mitad] == elem:

return mitad elif lista[mitad] > elem:

return busqueda_binaria_aux(lista, elem, inicial, mitad - 1) else:

return busqueda_binaria_aux(lista, elem, mitad + 1, final)

(30)

Algoritmos de Búsqueda: Comparaciones

Búsqueda secuencial

Problemas: siempre se recorre toda la lista.

Eficiencia: es directamente proporcional a la cantidad de elementos de la lista. En el peor de los casos se recorre toda.

Búsqueda binaria

Problemas: la lista debe estar ordenada.

Eficiencia: Es mucho más rápida que la búsqueda secuencial, en el peor de los casos se recorre el largo de la lista / 2.

(31)

Referencias y Lecturas Complementarias

Material suministrado por el profesor Jeff Schmidt, Instituto Tecnológico de Costa Rica. I semestre 2011.

J. Helo Guzmán, Introducción a la programación con Scheme, Segunda ed. Cartago:

Editorial tecnológica, 2005.

J. Solano, Introducción a la programación en Python, Primera ed. Cartago: Editorial tecnológica, 2011.

En general: http://docs.python.org/3/

(32)

17

Las presentaciones para el curso IC-1800:

"Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir

Igual 3.0 Costa Rica.

http://creativecommons.org/licenses/by-sa/3.0/cr/

http://creativecommons.org/licenses/by-sa/3.0/cr/

*La licencia de la presentación no cubre las imágenes utilizadas*

Referencias

Documento similar

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

Tras establecer un programa de trabajo (en el que se fijaban pre- visiones para las reuniones que se pretendían celebrar los posteriores 10 de julio —actual papel de los

En cuarto lugar, se establecen unos medios para la actuación de re- fuerzo de la Cohesión (conducción y coordinación de las políticas eco- nómicas nacionales, políticas y acciones

Otro ejemplo de tesauro es el Sociological Thesaurus, integrado en la plataforma Proquest (asociado a las bases de datos Sociological Abstracts y Social Service

También hay recursos en los que la búsqueda avanzada es en realidad una búsqueda experta, en la que no se dispone de un formulario con varias líneas de

Aquí tenéis un ejemplo, del Sociological Thesaurus , integrado en la plataforma Proquest (asociado a las bases de datos Sociological Abstracts y Social Service

CONSEJERÍA DE ECONOMÍA, INNOVACIÓN, CIENCIA Y EMPLEO.. Servicio Andaluz de Empleo.. CONSEJERÍA DE ECONOMÍA, INNOVACIÓN, CIENCIA Y

Volviendo a la jurisprudencia del Tribunal de Justicia, conviene recor- dar que, con el tiempo, este órgano se vio en la necesidad de determinar si los actos de los Estados