Está en la página 1de 8

Olimpiada de informtica del D.

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:

Martin Ibarra Romero

Olimpiada de informtica del D.F y Estado de Mxico


Ejemplo A:
Si nos dan un conjunto n de puntos en un plano cartesiano donde n puede ir desde 1<=n<=1,000. Y
los puntos son coordenadas x,y donde -1000<=x,y<=1000.
Se nos pide decir cunto mide la distancia ms corta entre esos puntos?
Ejemplo
Salida
3
5
1 1
20, 20
4 5
La distancia ms corta la hacen el punto 1,1 y e 4,5. Despus de pensar algn tiempo imagina que se te
ocurri este algoritmo.
/// leer entrada
lee n
para cada i desde 1 hasta n
lee x,
guardalos en arreglo de datos
fin
minima<-0
para cada i desde 1 hasta n-1
para cada j desde i+1 hasta n
dist = ( )2 + ( )2
si dist < minima entonces
dist<- minima
fin
fin
fin
imprime minima

Los que debemos hacer el calcular el polinomio (aunque esto es muy tardado, con la prctica no ser
necesario calcularlo).

Martin Ibarra Romero

Olimpiada de informtica del D.F y Estado de Mxico

/// leer entrada


lee n
para cada i desde 1 hasta n
lee x,
guardalos en arreglo de datos
fin
minima<-0
para cada i desde 1 hasta n-1
para cada j desde i+1 hasta n
dist = ( )2 + ( )2
si dist < minima entonces
dist<- minima
fin
fin
fin
imprime minima

Suponga que en cierto cpu (nuestra


cabeza) va a tardar cada instruccin
una operacin
lee n
para cada i desde 1 hasta n
lee x,
guardalos en arreglo de datos
fin
minima<-0
para cada i desde 1 hasta n-1
para cada j desde i+1 hasta n
dist = ( )2 + ( )2
si dist < minima entonces
dist<- minima
fin
fin
fin
imprime minima

(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.

Martin Ibarra Romero

Olimpiada de informtica del D.F y Estado de Mxico


Imagina que logramos obtener este algoritmo
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

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.

Martin Ibarra Romero

Olimpiada de informtica del D.F y Estado de Mxico


Si en este problema observamos que solo debemos verificar que es divisible hasta la raz del nmero
tendramos este nuevo algoritmo, esta observacin sale de lo siguiente:
Si 2 divide n, significa que tambin lo divide n/2 pero n/2 no es necesario hacerlo porque va implcito
en la verificacin de N/2. Ejemplo N=300, al dividir n/2=150 por tanto ya sabemos que 150 tambin
divide a 300.
Si 3 divide n, significa que tambin lo divide n/3 pero n/3 no es necesario hacerlo porque va implcito
en la verificacin de N/3. Ejemplo N=300, al dividir n/3=100 por tanto ya sabemos que 100 tambin
divide a 300.
Por tanto basta con probar con todos los nmeros desde 2 hasta .
A continuacin mostramos un algoritmo ms eficiente. En donde uso i*i <=n-1 en lugar de
i<=. (Truco para no manejar el tipo de datos flotantes)
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

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)

El polinomio nos quedara:


(3+xx) +5+(2xx)= por tanto nos quedara la complejidad de O() para nuestro ejemplo el caso
mximo es 44,721 que es mucho menos que los 200,000,000 millones que puede realizar nuestro
evaluador.
Ejemplo C:
Se nos da una lista de numeros que pude ir desde 2 hasta 30,000 y se nos pide encontrar cuanto mide la
distancia ms corta entre cualesquiera 2 nmeros.
Entrada
5 indica el nmero de datos
30
5
40
80
7

Martin Ibarra Romero

Salida
2 indica la distancia mnima de todas las parejas
de datos que en este caso forman 5 y 7.

Olimpiada de informtica del D.F y Estado de Mxico


Ahora veamos dos posibles soluciones la primera es:
lee n

Lee tarda (1)

para cada i desde 1 hasta n


lee valor
almacena en datos
fin

Este ciclo tarda 4n

minimo<- infinito

Tarda (1)

para cada i desde i hasta n-1


para cada j desde i+1 hasta n
distancia<- dato_j - dato_i
si distancia < minimo entonces
minimo<- distancia
fin
fin
fin
fin

Este ciclo tarda 9(n-1)(n-2)/2


En este caso puse el valor exacto

imprime minimo

Tarda (1)

Por tanto el polinomio seria


9(2 3 + 3) + 3 + 4n = 92 27 + 27 + 3 + 4n=92 23 + 20 tomando el termino de mayor
exponente tenemos que la complejidad es de O(2 ).
Por tanto el total de operaciones para el pero caso, sern 30,000*30,000=900,000,000 sobrepasando el
tiempo de un segundo.
Un mejor solucin sera tener los datos ordenados de tal manera que solo debemos recorrer el arreglo
una vez para determinar la distancia ms corta que existe.
El siguiente algoritmo muestra esta solucin.
lee n

Tarda (1)

para cada i desde 1 hat n


lee valor
almacena en datos
fin

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

Martin Ibarra Romero

2 (ver nota)
tarda (1)
tarda (6n)

Tarda (1)

Olimpiada de informtica del D.F y Estado de Mxico

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

Olimpiada de informtica del D.F y Estado de Mxico


De esta observacin nos damos cuenta que en cada pregunta se disminuye la mitad de posibles
nmeros. En el siguiente diagrama puede observar el nmero de preguntas (cada circulo representa una
pregunta) necesarias para llegar a un nmero siguiendo el algoritmo propuesto. Trate el lector de
aadir 3 niveles ms y note que por cada nivel se incrementa en solo una pregunta.

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 en cada pregunta disminuye la mitad realiza


o ms 2 preguntas. (vea diagrama anterior)
Recuerde que logaritmo de un nmero significa a
que potencia debo elevar la base para obtener el
valor N
2 32 =5

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.

Con el tiempo y un poco de prctica te bastar con


evaluar el crecimiento de los diversos procedimientos
de tu programa y as determinar la complejidad
rpidamente sin necesidad de hacer tantos clculos.

Martin Ibarra Romero

También podría gustarte