Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Nombre:
Anderson Alonso Luna Rodríguez
Selección def selection_sort(arr): [64, 34, 25, 12, 22, 11, 90] 1.0728836059570312e-
05 segundos
Realice la medición de tiempos de ejecución para cada algoritmo utilizando diferentes conjuntos de
datos de entrada.
Cite un ejemplo de ejercicios que demuestren los conceptos de notación asintótica, incluyendo O
Grande (O), Omega (Ω) y Teta (Θ).
Omega (Ω): Establece un límite inferior en el crecimiento del tiempo o espacio en función
del mejor caso.
En el mejor caso el elemento que estamos buscando esta justo en el centro del
arreglo, por lo que encontramos el elemento deseado en la primera comparación.
No importa cuán grande sea el arreglo. El tiempo de ejecución en el mejor caso
siempre será el mismo, es decir, una sola comparación. Por lo tanto, podemos
decir que el tiempo de ejecución en el mejor caso para la búsqueda binaria es
Ω(1), lo que significa que es un algoritmo de tiempo constante en el mejor caso.
Defina las estrategias de diseño de algoritmos "Divide y Vencerás". Esta técnica implica dividir un
problema en subproblemas más pequeños, resolverlos de manera independiente y luego combinar
sus soluciones para obtener la solución final.
Ejemplos:
Merge Sort: Un algoritmo de ordenación que divide una lista en mitades, ordena las
mitades por separado y luego combina las mitades ordenadas en una lista ordenada.
Quick Sort: Otro algoritmo de ordenación que divide una lista en subconjuntos mas
pequeños, ordena los subconjuntos y luego combina los subconjuntos ordenados.
Es una ecuación o relación matemática que se utiliza para describir el tiempo o el espacio
que consume un algoritmo recursivo en función de su tamaño de entrada.
Para analizar algoritmos recursivos, generalmente seguimos estos pasos:
1. Definir la recurrencia
2. Encontrar el caso base
3. Resolver la recurrencia
4. Análisis de la complejidad
Ejemplo:
def factorial (n):
if n == 0:
return 1
else:
return n * factorial (n – 1)
Recurrencia: La recurrencia para este algoritmo se puede definir como:
T(0) = 1 (caso base)
T(n) = n * T(n - 1) para n > 0 (caso recursivo)
A partir de aquí, se resuelven las llamadas recursivas desde abajo hacia arriba:
fibonacci(0) devuelve 0.
fibonacci(1) devuelve 1.
fibonacci(2) = fibonacci(1) + fibonacci(0) = 1 + 0 = 1.
fibonacci(3) = fibonacci(2) + fibonacci(1) = 1 + 1 = 2.
fibonacci(4) = fibonacci(3) + fibonacci(2) = 2 + 1 = 3.
fibonacci(5) = fibonacci(4) + fibonacci(3) = 3 + 2 = 5.