Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
La respuesta a esta pregunta va a depender de una serie de factores. Uno de ellos es la naturaleza
del problema a resolver. Si este es simple y con pocos datos, es posible decidirse por el algoritmo
más sencillo de codificar, o por uno ya existente, sin preocuparse demasiado por sus propiedades
teóricas. En cambio, si el problema a resolver es complejo, con muchos casos y con una cantidad
de datos que tiende a crecer, es necesario seleccionar de una manera más cuidadosa, aplicando
un proceso de análisis más exhaustivo.
Los criterios para evaluar un programa son diversos: eficiencia, portabilidad, eficacia, robustez, etc.
El análisis de complejidad está relacionado con la eficiencia del programa.
En computación hay dos recursos que son escasos: memoria(espacio) y tiempo. Se puede utilizar
indistintamente el consumo de uno de estos recursos como métrico para evaluar la eficiencia del
algoritmo. La eficiencia mide el uso de los recursos del computador por un algoritmo, como el
tiempo de cálculo para ejecutar las operaciones (complejidad en tiempo) y el espacio de memoria
para contener y manipular el programa más los datos (complejidad en espacio).
Para efectos del análisis de un algoritmo se define la complejidad como la relación que existe
entre el consumo de recursos y el número de datos que se procesan. En sentido estricto, la
complejidad define el consumo de recursos como una función del tamaño de los datos a procesar.
Por ejemplo, una búsqueda binaria se dice que se ejecuta en un número de pasos proporcional al
logaritmo de la longitud de la estructura de datos donde se realiza la búsqueda, ´o en O(log(n)),
dicho coloquialmente como tiempo logarítmico.--> IR A PUNTO 2
Definición formal :
x2=0(ex), se traduce en que x2 es de orden ex si y solo si existe una constante positiva cE R+ tal
que para todo n>n0 se cumpla que
x2<c.ex
Esto también refleja una dominancia de funciones donde la función x2 esta acotada superiormente
por un múltiplo de la función x2.
Entonces la expresión f(x) =0(g(x)) o x2=0(ex) también denota una dominancia de funciones donde
la función f (x2) esta acotada superiormente por un múltiplo de la función g, que en este caso es
(ex).
El análisis de complejidad mide el tiempo de cálculo para ejecutar las operaciones (complejidad
en tiempo) y el espacio de memoria para contener y manipular el programa más los datos
(complejidad en espacio). El análisis de complejidad está relacionado con la eficiencia del
programa.
Definición formal: Se considerará la entrada de datos al programa como el factor para el cálculo
de su complejidad. Así, la complejidad T(n) de un algoritmo es de O(f(n)) si T, f : N ! R+ y 9 c 2 R+
y n0 2 N tal que 8n > n0 se cumpla T(n)
Cuantificar las medidas físicas: "tiempo de ejecución y espacio de memoria" y comparar distintos
algoritmos que resuelven el mismo problema.
Proporcionar un criterio de medición objetivo que permita comparar algoritmos y determinar cuál
de ellos es mejor. Los criterios para evaluar algoritmos son diversos: sencillez, eficiencia,
portabilidad, eficacia, robustez, etc.
De acuerdo al recurso que se mide( espacio o tiempo) se definen dos tipos de complejidad:
Complejidad en tiempo o temporal: Se define como la relación que existe entre el tiempo de
ejecución de un algoritmo y el número de datos que procesa.
Definición 1:
Sean f y g dos funciones, f,g: +-{0}. Se dice que f=(g) (f es de orden g) si y solo si existe
c+ y n0 tal que nn0 se cumpla f(n)c.g(n). ( no incluye el 0).
En la definición anterior, denota una relación de dominancia de funciones, en donde la función
f está acotada superiormente por un múltiplo de la función g (f es dominada por c.g(n)). Así la
expresión f=(g) refleja que el orden de crecimiento asintótico de la función f es inferior o igual al
de la función g.
a.- Ejemplo:
f(n)=log2(n+1). Tomemos g(n)=log2(n). Aunque f(0) está definida, podemos restringir su dominio a
f(n) con n>0. Así, que f,g:+-{0}, y además c+ (c=2) y n0 (n0=2) tal que nn0 se
cumpla f(n)c.g(n). Así, log2(n+1)=log2(n)
b.- Ejemplo:
Demostrar np(np+1).
Por reducción al absurdo, tomemos np=(np+1). Entonces c+ y n0 tal que nn0 se
cumpla npc.np+1 cn (contradicción, c debe ser constante).
Se puede demostrar que es una relación de preorden, porque es reflexiva y transitiva (no es
simétrica). Así,
Es reflexiva: f=(f)
Pruebas:
(Prop. 2) c.f. 1.c.f. Por tanto, c.f = O(c.f). Igualmente, c.f c.f, por tanto c.f = O(f). Así, O(c.f) es
equivalente a O(f).
(Prop. 3) f1=(g1) f2=(g2) Por Def. 1,c,d+ y n1,n2 tal que nn1: f1c.g1 y nn2:
f2d.g2
Por lo tanto, k+ (k=d+c) y n0 (n0=Max{n1,n2}) tal que nn0 se cumpla:
Por Def. 1
{Fin de pruebas}
Determinar el comportamiento del algoritmo en función del tamaño del problema, y reflejar
cuán grande puede ser el mismo
Determinar cuánto tiempo de cómputo aumenta al incrementar el tamaño del problema en una
unidad (f(n+1)-f(n))
Facilita la comparación de algoritmos y permite determinar entre varios algoritmos, cuál será el
más eficiente en teoría (el que tiene menor tasa de crecimiento).
1 < log2n n n.log2n n2 p3(n) ... pk(n) … < 2n en 3n ... nn ...
4- Regla de la suma
Sean T1(n) y T2(n) las funciones de complejidad para ejecutar dos instrucciones P1 y P2 de
complejidad T1(n) = O(f(n)) y T2(n) = O(g(n)) respectivamente, la secuencia de instrucciones P1 y
P2 es T1(n) + T2(n) = O(Maxf(n), g(n)).
La operación de E/S es T(n) = c, por lo tanto es O(1). De la regla de la suma se deriva que la
complejidad de una secuencia de k instrucciones con Ti(n) = O(fi(n)) es Pk i=1 Ti(n) = O(Maxf1(n),
f2(n), ..., fk(n)).
La complejidad de una selección viene dada por la complejidad de ejecutar la condición y las
instrucciones. Del mismo modo, en un ciclo iterativo la complejidad es la sobre del cuerpo de
iteración más la evaluación de la condición de terminación del ciclo.
Cm(T) = costo asociado; el costo en espacio para una variable u objeto de tipo T. Los tipos de
datos no ocupan espacio, sino las variables u objetos de un tipo. Las unidades para medir la
complejidad en memoria son palabras. A continuación se discuten diferentes costos:
a) Si T es un tipo elemental, entonces por conveniencia cualquier variable del tipo T tiene
como costo una palabra. Así, Cm(T)=1.
b) Un string de tamaño n ocupa Cm(string)=n/4+3 palabras de memoria, asumiendo que un
caracter en un string ocupa 1 byte y que la unidad de palabra es de 4 bytes, y que el
descriptor del string ocupa 3 palabras.
c) Para un arreglo unidimensional usaremos la siguiente definición genérica:
entonces Cm(AB)=(Ls1-Li1+1)*(Ls2-Li2+1)*Cm(Tbase)+6
C1: T1;
C2: T2;
...
Cn: Tn;
FinRegistro
n
entonces Cm(Reg) = Cm( Ti )
i 1
In case of Discri:TipoDisc
<Caso1>: <Datos1>;
<Caso2>: <Datos2>;
...
<Cason>: <Datosn>
EndCase
EndRecord
Cm(Reg) = Cm(TipoDisc) + 1 n
i 1