Documentos de Académico
Documentos de Profesional
Documentos de Cultura
F y Estado de Mxico
Cmo saber cunto tardar en ejecutarse mi programa y cuanta memoria utilizar?
Para fines prcticos (mientras podemos tener una clase de complejidad computacional) vamos hacer lo
siguiente:
Debes calcular el polinomio de tu solucin y de ah extraer el trmino de mayor potencia y esa ser la
complejidad, el sistema evaluador del estatal es capaz de realizar 200 millones de operaciones por
segundo (mientras que el evaluador nacional hace aproximadamente 500,000,000 operaciones por
segundo) as que haces la divisin del tiempo de tu programa entre la operaciones que realiza el sistema
evaluador ser el tiempo. (Antes de codificar tu programa es necesario que comprendas cuanto tiempo
y memoria utilizar tu idea de solucin), si tuvieras un empate tcnico considera la n hacia un valor
muy grande a fin de romper el empate ve ejemplo C.
Si de tu programa te sale este polinomio 52 + 3 + 12 el termino de mayor exponente es 2 por
tanto tu programa tiene una complejidad de O(2 ) (se lee de orden cuadrada). El valor de n viene
dado por el tamao de la entrada, supn que tu programa debe operar sobre una entrada de datos
entre 1<=n<=10,000, entonces tu programa en el peor caso (entrada ms grande) necesitara
10,000*10,000 = 100,000,000 operaciones sobre la n. El evaluador del estatal puede manejar 200
millones de operaciones por segundo, por tanto si dividimos 100,000,000 / 200,000,000 =.5 tu
programa tardara 1/2 segundo en tomar los datos de entrada y dar el resultado. Con un poco de
prctica no ser necesario que calcules el polinomio por cada programa o idea de solucin que tengas.
Para hacer el clculo practico debemos tener presente que cada cpu es diferente en velocidad,
memoria, tamao del bus de datos, lo cual dificulta hacer un clculo exacto del tiempo que tardar la
ejecucin de nuestro programa, motivo por el cual utilizaremos la notacin asinttica (termino de mayor
exponente) propuesta en el prrafo anterior.
Para medir la memoria basta con sumar todas las variables de los arreglos utilizados en nuestro
programa, ya que la memoria utilizada por las dems variables es mnima comparada con la utilizada por
los arreglos.
Veamos Algunos ejemplos prcticos:
Los que debemos hacer el calcular el polinomio (aunque esto es muy tardado, con la prctica no ser
necesario calcularlo).
(1)
(n)
(n)
(n)
(1)
(n)
(n)
(n)
(n)
(n)
(n)
(n)
(n)
(1)
Si te fijas esto nos dara el siguiente polinomio (el doble ciclo para se redonde n veces para facilitar
su clculo)
1+3n+1+n(n+n+n+n+n+n+n)+1 =72 + 3 + 2 si tomamos el termino de mayor exponente tenemos
que la complejidad es de O(2 ). Si la entrada mxima es de 1000 puntos estos nos dara un total de
1000*1000 =1,000,000 de operaciones, considerando los 200,000,000 de operaciones del evaluador
nuestro algoritmo se ejecutara en mucho menos tiempo de un segundo.
Midiendo la memoria, si observamos solo requerimos la memoria para almacenar los puntos como el
mximo son 1,000 puntos y cada punto tiene dos variables X y Y.
Por tanto 1,000 puntos por 2 variables por 4 bytes de cada variable=8,000 bytes =8kb
Recuerda que la variables enteras (int) ocupan 32 bits igual a 4 bytes.
Ejemplo B:
Nos dan un nmero n donde 1<=n<=2,000,000,000 y se nos pide decir si ese nmero es primo o no.
Recuerda que un nmero primo es el que solo es divisible en el mismo y la unidad, por ejemplo 7 es
primo porque solo es divisible entre 7 y el 1, en cambio 9 no es primo ya que adems de ser divisible
por 1 y 9 tambin lo es por 3.
lee n
primo<- verdadero
para cada i desde 2 hasta n-1
si residuo n /i es cero entonces
primo<- falso
fin
fin
si primo es verdadero entonces
imprime "es primo"
sino
imprime "no es primo"
fin
(xx) de un estimado
(1)
(1)
(n)
(n)
(xx)
(n)
(n)
(1)
(1)
(xx)
(xx)
(1)
El polinomio quedara
(3+xx)n+5+(2xx)= dando una complejidad de orden n, O(N) si observamos contra la entrada el valor
de n puede ir desde 1 hasta 2,000,000,000, por tal motivo se saldr de tiempo, para lo cual debemos
utilizar un mejor algoritmo.
Lee n
primo<- verdadero
para cada i desde 2 hasta i*i <=n-1
si residuo n /i es cero entonces
primo<- falso
fin
fin
si primo es verdadero entonces
imprime "es primo"
sino
imprime "no es primo"
fin
(xx) de un estimado
(1)
(1)
()
()
(xx)
()
()
(1)
(1)
(xx)
(xx)
(1)
Salida
2 indica la distancia mnima de todas las parejas
de datos que en este caso forman 5 y 7.
minimo<- infinito
Tarda (1)
imprime minimo
Tarda (1)
Tarda (1)
Tarda (4n)
sort datos
minimo<- infinito
para cada i desde i hasta n-1
distancia<- dato_i+1 - dato_i
si distancia < minimo entonces
minimo<- distancia
fin
fin
imprime minimo
2 (ver nota)
tarda (1)
tarda (6n)
Tarda (1)
El polinomio seria: 1+4n + n log 2 n +1+6n+1 = n log 2 n +10n+3 el termino de mayor exponente en
este caso es 2 ya que 10n y n log 2 n tiene el mismo exponente pero si hacemos a n lo
suficientemente grande el valor de n log 2 n siempre ser siempre mayor a 10n.
NOTA: Usando la funcin sort del lenguaje, este siempre ordenara n datos en no ms de n log 2 n
operaciones y/o comparaciones. EJEMPLO; Si tenemos que ordenaR 30,000 datos el tiempo sera de:
30,000 x log 30,000 = 30,000 x 16 = 480,000 (log de 30,000 se redonde al entero mayor ms cercano)
Por tanto esta segunda solucin queda dominada por la operacin de ordenamiento con una
complejidad de n log 2 n que se ejecutar en tiempo.
Ejemplo D
Tengo que adivinar un nmero entre 1 y 2,000,000,000 en el menor nmero de preguntas, las preguntas
son de la forma digo un nmero y se me contesta eureka cuando le atino, es mayor si el nmero a
adivinar es mayor al que dije y es menor si el numero adivinar es menor al que dije. A continuacin
muestro un ejemplo:
Numero adivinar 30:
Yo digo 50
Yo digo 40
Yo digo 10
Yo digo 30
Un posible algoritmo sera
lee n
para cada i desde 1 hasta n
si es i entonces
eureka
salgo del ciclo
fin
fin
Me contestan es menor
Me contestan es menor
Es mayor
Eureka
lee n
para cada i desde 1 hasta n
si es i entonces
eureka
salgo del ciclo
fin
fin
(1)
(n)
(n)
(1)
(1)
(n)
(1)
El polinomio sera
4n+4= complejidad O(n), para los limites del problemas insuficientes, ya que para el peor caso tendra
que hacer 2,000,000,000 preguntas.
Un mejor algoritmo estara basado en la siguiente observacin, que preguntemos por la mitad en
nuestro caso de ejemplo sera preguntar por 25 como nos contestan es mayor observe que ya no vale
la pena preguntar por ningn nmero entre 1 y 25 por tal motivo eliminamos la mitad de valores, si nos
hubieran contestado que es menor, significa que ya no vale la pena preguntar por cualquier nmero
mayor o igual a 25.
Martin Ibarra Romero
Veamos el algoritmo
lee n
inicio=1
final=N
mitad = n/2
mientras no sea mitad
si es mayor a mitad
inicio=mitad+1
si es menor a mitad
final = mitad-1
fin
mitad <- (inicio+final) / 2
fin
imprime eureka el valor buscado es
Mitad
Como con cada pregunta disminuyen los nmeros a la mitad, podemos decir que el polinomio es
(2 + )2 + 5= lo que implica una complejidad de O(2 ) para nuestro problema
2 2000,000,000<=65,536 por tanto este nuevo algoritmo si se ejecutara en tiempo.