Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos de búsqueda
• Algoritmo de búsqueda: método para encontrar un elemento o grupo de elementos
con propiedades específicas dentro de una colección de elementos.
• La colección es llamada espacio de búsqueda
• Ejemplos sierra – el hallar la raíz cuadrada como un problema de búsqueda
- Enumeración exhaustiva
- Búsqueda de bisección
- Newton- Raphson
• Complejidad?
- Si el elemento no está en la lista, de necesita O( len(L)) pruebas
- Así que la mejor búsqueda lineal es longitud de L
Indirección
• Caso sencillo: lista de enteros
- Cada elemento es del mismo tamaño (por ejemplo, cuatro unidades de la memoria - o
cuatro bytes de ocho bits)
- Luego la dirección en memoria del ith elemento es: inicio+ 4 * i donde inicio es la
dirección de inicio de la lista
- Así que puede llegar a ese punto de la memoria en tiempo constante
Indirección
• Pero, ¿y si la lista es de los objetos de tamaño arbitrario?
• Use la indirección
• Representar una lista como una combinación de una longitud (número de objetos), y
una secuencia de indicadores de tamaño fijo a objetos (o direcciones de memoria)
Indirección
• Si la longitud de campo es de 4 unidades de memoria, y cada puntero ocupa 4
unidades de memoria
• Luego, la dirección del ith elemento se almacena en: inicio + 4 + 4 * i
• Esta dirección se puede encontrar en un tiempo constante, y el valor almacenado en la
dirección también encontrado en tiempo constante
• Así que la búsqueda es lineal
• Indirección: el acceso a algo accediendo primero algo que contiene una referencia a
lo solicitado.
Búsqueda binaria
• ¿Podemos hacer algo mejor que O(len(L)) para la búsqueda?
• Si no se sabe nada acerca de los valores de los elementos en la lista, entonces no.
• Peor caso, tendría que reconocer a cada elemento
• Mejora la complejidad media, pero peor de los casos todavía tienen que buscar cada
elemento.
Búsqueda binaria
if len(L) == 0:
return False
else:
return busquedaBi(L, e, 0, len(L))
Algoritmos de ordenación
• ¿Qué pasa con el costo de la ordenación?
• Asumir la complejidad de la ordenación de una lista es O(ordena( L))
• A continuación, si ordenar y buscar lo que queremos saber si:
ordena (L) + log(len(L)) < len (L)
- Es decir, debemos ordenar y buscar utilizando búsqueda binaria, o sólo se tiene que
utilizar la búsqueda lineal
• No se puede ordenar en menos tiempo que la búsqueda lineal!
Amortización de costos
• Sin embargo, supongamos que queremos buscar una lista de k veces?
• A continuación, es una especie (L) + k * log (len (L)) < k * len (L) ?
- Depende de k, pero uno espera que si una especie se puede hacer de manera eficiente,
entonces es mejor primero ordenar
- Coste amortizable de clasificación a través de múltiples búsquedas puede hacer que
esto valga la pena
- ¿Cómo podemos solucionar de manera eficiente?
def selec(L):
for i in range(len(L) - 1):
minIndx = i
minVal= L[i]
j=i+1
while j < len(L):
if minVal > L[j]:
minIndx = j
minVal= L[j]
j += 1
temp = L[i]
L[i] = L[minIndx]
L[minIndx] = Temp.
Complejidad de Mezcla
• Comparación y copia son constantes
• El número de comparaciones - O(len(L)
• Número de copias - O(len(L1) + len(L2))
• Así que la mezcla es lineal en la longitud de las listas
Colocando juntos
import operator
• Mezcla es O(len(L))
• Por mezcla es O(len(L))*número de llamadas para fusionar
- O( len (L)) * número de llamadas a mezcla
- O(len(L) * log(len(L)))
• Registrar lineal - O(n log n), donde n es len (L)
• Viene con costo en el espacio, como lo hace la nueva copia de la lista
Mejorando la eficiencia
• Combinación de búsqueda binaria con la ordenación mezcla es muy eficiente
- Si buscamos lista k veces, entonces la eficiencia es n * log ( n) + k * log ( n)
• ¿Podemos hacerlo mejor?
• Diccionarios utilizan concepto de hash
- Operaciones de búsqueda se puede hacer en tiempo casi independiente del tamaño
del diccionario
Hashing
• Convertir la clave a un int
• Utilice int para indexar en una lista (tiempo constante)
• Conversión haciendo uso de la función hash
- Aplicación de gran espacio de entradas para un pequeño espacio de salidas
- Así, una aplicación de muchos-a - uno
- Cuando dos entradas van a la misma salida - una colisión
- Una buena función hash tiene una distribución uniforme- Minimiza la probabilidad de
una colisión
Complejidad
• Si no hay colisiones, entonces O(1)
• Si par todo hash al mismo cubo, entonces O(n)
• Pero, en general, se puede negociar el espacio para hacer tabla hash grande, y con
buena función que se acerque a la distribución uniforme, y reducir la complejidad a
cerca de O(1)