Documentos de Académico
Documentos de Profesional
Documentos de Cultura
– Las instrucciones del algoritmo son ejecutadas una cantidad fija de veces.
– Esto es bueno para un algoritmo que tiene que procesar y/o producir n
elementos de entrada y/o salida.
– 20! = 2432902008176640000
3.5 Jerarquía de funciones
Resultados:
3.6 Casos en complejidad computacional
Mejor caso:
– Menor tiempo de ejecución sobre todas las entradas de tamaño n.
1) Registros de un archivo
– Consideremos el problema de accesar a los registros de un archivo.
Cada registro tiene una única clave que se utiliza para recuperar los registros
del archivo.
– Problema: Dada una clave cualquiera, localizar el registro que contenga tal clave.
Mejor caso:
f(n) = 1
El registro buscado es el primero en ser consultado
Peor caso:
f(n) = n
El registro buscado es el ultimo en ser consultado o no esta presente en el
archivo.
Caso medio:
f(n) = (n + 1)2
2) Mayor y menor elemento: versión 1
– Problema: Hallar el mayor y menor elemento de un vector de enteros A[1: n]; n 1.
void maxmin1(vector A)
…
max = A[0]; min = A[0]
PARA (i = 1: i n)
SI ( A[i] max)
max = A[i]
SI ( A[i] min)
min = A[i]
FINPARA
Análisis
– Sea f una función de complejidad tal que f(n) es el número de comparaciones entre
los elementos de A, si A tuviera n elementos.
Ejemplos:
– Un programa con tiempo O(n) es mejor que otro programa con tiempo
O(n2).
– Un programa A emplea 100n unidades de tiempo para ser ejecutado, otro
programa B emplea 2n2 . ¿Cuál es el mejor?.
Depende el tamaño del problema.
Determinar el:
– Tiempo de ejecución puede ser un problema matemático complejo.
– Sucesión de comandos:
Esta determinado por el mayor tiempo de ejecución de cualquier comando de la
sucesión.
– Comando de decisión: SI
Tiempo empleado por los comandos que están dentro del comando de
decisión, mas el tiempo para evaluar la condición SI, que es O(1).
Luego se evalúan los procedimientos que llaman a los procedimientos (los cuales
no llaman a otros procedimientos).
– Procedimientos recursivos:
Asocia una función de complejidad f(n) desconocida, donde n mide el tamaño de
los argumentos.
Ej.- for (int i= 0; i < K; i++) { algo_de_O(1) } => K*O(1) = O(1)
Ej.- for (int i= 0; i < N; i++) { for (int j= 0; j < N; j++) { algo_de_O(1) } }
tendremos N * N * O(1) = O(n2)
Ej.- for (int i= 0; i < N; i++) { for (int j= 0; j < i; j++) { algo_de_O(1) } }
el bucle exterior se realiza N veces, mientras que el interior se realiza 1,
2, 3, ... N veces respectivamente.
En total, 1 + 2 + 3 + ... + N = N*(1+N)/2 -> O(n 2)
A veces aparecen bucles multiplicativos, donde la evolución de la
variable de control no es lineal (como en los casos anteriores)
Ej.- c= 1; while (c < N) { algo_de_O(1) c= 2*c; }
El valor incial de "c" es 1, siendo "2 k" al cabo de "k" iteraciones. El
número de iteraciones es tal que 2 k >= N => k= eis (log2 (N)) [el entero
inmediato superior] y, por tanto, la complejidad del bucle es O(log n).
Ej.- c= N; while (c > 1) { algo_de_O(1) c= c / 2; }
Un razonamiento análogo nos lleva a log 2(N) iteraciones y, por tanto, a
un orden O(log n) de complejidad.
Ej.- for (int i= 0; i < N; i++) { c= i; while (c > 0) { algo_de_O(1) c= c/2; } }
tenemos un bucle interno de orden O(log n) que se ejecuta N veces,
luego el conjunto es de orden O(n log n)
Ejemplo (procedimiento no recursivo)
– Ordenar los n elementos de un conjunto A en orden ascendente:
INICIO
Por lo tanto:
(1) PARA (i = 1: i < n) O(1) Condición terminación O(1) O((n-i)x(n-1))
FINPARA
FIN n 1
(n i )
1
n ( n 1)
2 n2
2 n2 O(n 2 )