Complejidad Algoritmica
Complejidad Algoritmica
COMPLEJIDAD ALGORTMICA
Conceptos bsicos. Medidas de comportamiento asinttico. Reglas prcticas para hallar el coste tiles matemticos Complejidad de algoritmos de bsqueda y ordenacin
DEFINICIN DE ALGORITMO
Un algoritmo implica la descripcin precisa de los pasos a seguir para alcanzar la solucin de un problema dado. Por pasos se entiende el conjunto de acciones u operaciones que se efectan sobre ciertos objetos. Algoritmo: Entrada Proceso Salida
CARACTERSTICAS DE UN ALGORITMO
CUALIDADES DE UN ALGORITMO
Un algoritmo debe ser adems:
General: Es deseable que un algoritmo sea capaz de resolver una clase de problemas lo ms amplia posible. Eficiente: Un algoritmo es eficiente cuantos menos recursos en tiempo, espacio (de memoria) y procesadores consume.
Por lo general es difcil encontrar un algoritmo que rena ambas por lo que se debe alcanzar un compromiso que satisfaga lo mejor posible los requisitos del problema.
COMPLEJIDAD ALGORITMICA.
La complejidad algortmica representa la cantidad de recursos (temporales) que necesita un algoritmo para resolver un problema y por tanto permite determinar la eficiencia de dicho algoritmo. Los criterios que se van a emplear para evaluar la complejidad algortmica no proporcionan medidas absolutas sino medidas relativas al tamao del problema.
Para conseguir esta independencia una posible medida abstracta puede consistir en determinar cuantos pasos se efectan al ejecutarse el algoritmo.
Otra caracterstica importante es que no todos los datos, dentro de un problema, poseen la misma importancia de cara a la complejidad algortmica.
Otra caracterstica es que la complejidad algortmica no slo depende del tamao sino del propio dato en s.
Tmax(n): Representa la complejidad temporal en el peor de los casos. Tmin(n): Representa la complejidad en el mejor de los casos posibles. Tmed(n): Expresa la complejidad temporal en el caso promedio. Para su clculo se suponen que todas las entradas son equiprobables.
Clculo de Tmax, Tmin, y Tmed para el algoritmo de bsqueda secuencial ordenada: Nomenclatura del tiempo constante empleado por las siguientes operaciones:
suma:s comparacin: c asignacin: a
med
T ( j)P + k =
donde
P = 1 n
j =1
med
( jk
j =1
)1
= + 1 )n + k 2
med
j =1
k1 n
j + k
j =1
k 2 n + 1
k1 n k
2
(n
=
(n ) =
(n
)+
k1n k1 + + k 2 2
= c1n + c
log n
3.3 10-6 5.6 10-6 6.6 10-6 10-5 1.3 10-5 1.6 10-5 2 10-5
n
10-5 5 10-5 10-4 0.001 0.01 0.1 1
n log n
3.3 10-5 2.8 10-4 6.6 10-4 0.01 0.13 1.6 19.9
n2
10-4 0.0025 0.01 1 100 104 106
n3
0.001 0.125 1 1000 106
2n
0.001
n!
3.63
en
2n2 8n 20lg n
en
2n2
8n 20lg n
NOTACIN O MAYSCULA
Definicin: Sean f,g:Z+ R+ , se dice que fO(g) o que f es del orden de g si existen constantes no Z+ y R+ tales que:
f(n) g(n) para todo nno
Esto significa que f no crece ms deprisa que g. De esta forma acotamos superiormente el comportamiento asinttico de la funcin salvo constantes. Para el algoritmo de Bsqueda secuencial ordenada:
Tmax(n)=k1n+k2 O(n) ya que k1n+k2 n para todo nk2/(-k1)
i=1
f (i) O
n +1
g ( x ) dx
Si f(i)=i.
i =
(n
i=1
+ 1 )n 2
n 2 n + 2 2
n + 1
x dx
x 2 = 2
n +1
=
1
(n + 1) 2
1 = 2
n 2 + n 2
n +1
(n
k +1
)
+1
i=1
dx
x k +1 = k + 1
n +1
=
1
(n + 1) k k + 1
1 k + 1
1 (n
+ 1
)k + 1
+ k
(n
k +1
Los comportamientos asintticos de ms frecuente aparicin se pueden ordenar de menor a mayor crecimiento de la siguiente forma: 1<<log n<<n<<n log n<<n2<<n3<<.....<<2n<<n!
INSTRUCCIONES SIMPLES
Se considera que se ejecuta en tiempo constante:
La evaluacin de las expresiones aritmticas siempre que los datos sean de tamao constante as como las comparaciones de datos simples. Las operaciones de asignacin, lectura y escritura de datos simples. Las operaciones de acceso a una componente de un array, a un campo de un registro y a la siguiente posicin de un registro de un archivo.
COMPOSICIN DE INSTRUCCIONES
Si suponemos que las instrucciones I1 e I2 poseen complejidades temporales, en el peor de los casos de T1(n) y T2(n) respectivamente entonces el coste de la composicin de ambas instrucciones ser:
TI1,I2(n)=T1(n)+T2(n)
INSTRUCCIONES DE SELECCIN
Para la instruccin condicional:
if <condicin> then I1 else I2 Tseleccin(n)=Tcondicin(n)+max(T1(n),T2(n)) Case <expresin> of
caso1: I1; caso2: I2; ..... ..... cason: In;
bucle
(n ) = m +
j =1
(n )
Donde m representa las m veces que se incrementa i y la comprobacin de si est entre los extremos inferior y superior. Si el campo interior consume un tiempo constante entonces la ecuacin anterior se escribe de la siguiente forma:
bucle
(n ) = m ( + T 1
(n )
SUBPROGRAMAS
El coste de un subprograma se deriva de las reglas anteriores. Si el subprograma es recursivo entonces hay que distinguir entre los casos base y recurrentes.
SUBPROGRAMAS
FUNCTION Fac(n:integer):integer; Begin if n=0 then Fac:=1 else Fac:=n*Fac(n-1) End;{Fac} El caso base posee un coste constante: Tfac(0)=1 Para los casos recurrentes:
Tfac(n)=1+Tfac(n-1)= Tfac(n)=1+1+Tfac(n-2)= ..................................... Tfac(n)=1+1+....+1+Tfac(0) = n+1O(n)
TILES MATEMTICOS
Para el clculo de la complejidad es til saber como calcular trminos generales de sucesiones en las que los trminos se definen en funcin de los trminos anteriores.
i=1
(x 1
+ x 2
)n
= x
n 1
+ r
1 + x + x
+ ... + x
n 1
1 x n = 1 x
1 1 x si x < 1
=1 + x + x
+ ... =
i=1
i=1
x i = e i !
( 1 )
i=1
x i
= log
x n = b 1 b 2 .... b n x 0
(1 b n ) = b n x0 + c (1 b )b n
Ordenacin de vectores
Seleccin directa Insercin directa Intercambio directo Ordenacin rpida (Quick Sort) Ordenacin por mezcla (Merge Sort)
Estructura de datos:
const N=100; type tIntervalo=0..N; tvector=array[1..N] of tElem {tipo ordinal}
Algoritmos de bsqueda:
Bsqueda secuencial Bsqueda secuencial ordenada Bsqueda binaria
BSQUEDA SECUENCIAL
La bsqueda secuencial consiste en comparar secuencialmente el elemento deseado con los valores contenidos en las posiciones 1,....,n. El proceso termina cuando o bien encontramos el elemento o bien se alcanza el final del vector. Un primer nivel de diseo:
ind:=0 buscar elemento en vector si vector[ind]=elemento entonces busquedasecuencial:=ind sino busquedasecuencial:=0
BSQUEDA SECUENCIAL,
IMPLEMENTACIN EN PASCAL
FUNCTION Busquedasec(v:tvector ; elem:telem):tIntervalo; {Dev. 0 si el elemento no est en v o i si v[]=elem} VAR i:tIntervalo; BEGIN i:=0; repeat i:=i+1; until (v[i]=elem) or (i=N); if v[i]=elem then busquedasec:=i else busquedasec:=0 END; {busquedasec}
El nmero de veces que se ejecuta El algoritmo depender del bucle. En el peor de los casos ser de orden O(n).
El algoritmo anterior puede ser mejorado si el vector v esta ordenado (i.e. Creciente). De esta forma si durante la bsqueda se alcanza una componente con mayor valor que elem, podremos asegurar que no se encuentra dentro de la coleccin.
BSQUEDA BINARIA
El hecho de que el vector este ordenado se puede, tambin, aprovechar para conseguir una mayor eficiencia planteando el siguiente algoritmo.
Comparar elem con el elemento central del vector. Si este es el elemento buscado se finaliza. Si no se sigue buscando en la mitad del vector que determine la relacin entre el valor del elemento central y el buscado. Este algoritmo finaliza cuando se localiza el elemento o se termina el vector.
BSQUEDA BINARIA,
IMPLEMENTACIN EN PASCAL
FUNCTION Busquedabinaria(v:tvector ; elem:telem):tIntervalo; {Prec. V esta ordenado crecientemente} {Dev. 0 si el elemento no est en v o i si v[]=elem} VAR einf,esup,posmed:tIntervalo; encontrado:boolean; BEGIN einf:=1; esup:=N; encontrado:=false; while not encontrado and (esupeinf) do begin posmed:=(esup+einf) DIV 2; if elem=v[posmed] then encontrado:=true else if elem>v[posmed] then einf:=postmed+1 else esup:=postmed-1 end {while}
BSQUEDA BINARIA,
IMPLEMENTACIN EN PASCAL
BSQUEDA BINARIA
La complejidad algortmica de la bsqueda binaria es:
Teniendo en cuenta que: 2k N2k+1 entonces en el peor de los casos: T(n)O[logN] 2k N de donde log2k logN k logN
ORDENACIN DE VECTORES
Como se ha presentado con anterioridad, disponer de una coleccin de datos ordenados facilita la operacin de bsqueda. A continuacin se presentan algunos de los algoritmos de ordenacin ms frecuentes: Algoritmos cuadrticos:
Seleccin directa Insercin directa Intercambio directo
SELECCIN DIRECTA
Procedimiento: Recorre el vector y selecciona en cada uno de los recorridos el menor elemento para situarlo en su lugar correspondiente.
SELECCIN DIRECTA
1. Se sita en v[1] el menor elemento de entre v[1],...,v[n]. Para ello se intercambian los valores de v[1] y v[i] {v[i]=min(v)}
4 5 7 1 9 8 2
2. Se sita en v[2] el menor elemento de entre v[2],...,v[n]. Para ello se intercambian los valores de v[2] y v[i] {v[i]=min(v)}
1 5 7 4 9 8 2
(n-1). Se sita en v[n-1] el menor elemento de entre v[n-1] y v[n]. Para ello se intercambian los valores de v[n-1] y v[n].
1 2 4 5 7 8 9
SELECCIN DIRECTA,
IMPLEMENTACIN EN PASCAL
PROCEDURE Selecciondirecta( var v:tvector); {Efecto. Se ordena v ascendentemente} VAR i, j,posmenor:tIntervalo; valmenor,aux:telem; BEGIN for i:=1 to N-1 do begin valmenor:=v[i] posmenor:=i for j:=i+1 to N do if v[j]<valmenor then begin valmenor:=v[j]; posmenor:=j end; {if }
SELECCIN DIRECTA,
IMPLEMENTACIN EN PASCAL
if posmenor<>i then begin aux:=v[i]; v[i]:=v[posmenor]; v[posmenor]:=aux end {if} end{for i} END; {Selecciondirecta}
INSERCIN DIRECTA
Procedimiento: Recorre el vector v insertando el elemento v[i] en su lugar correcto entre los ya ordenados.
INSERCIN DIRECTA
1. Se considera v[1] como primer elemento. 2. Se inserta v[2] en su posicin correspondiente en relacin a v[1] y v[2]. 3. Se inserta v[3] en su posicin correspondiente en relacin a v[1], v[2] y v[3]. i. Se inserta v[i] en su posicin correspondiente en relacin con v[1],...,v[i]. n. Se repite la operacin con el ltimo elemento del vector.
INSERCIN DIRECTA,
IMPLEMENTACIN EN PASCAL
PROCEDURE Inserciondirecta( var v:tvector); {Efecto. Se ordena v ascendentemente} VAR i, j:tIntervalo; aux:telem; BEGIN for i:=2 to N do begin aux:=v[i] Desplazamiento del j:=i-1 menor valor while (j1) and (v[j]>aux) do begin v[j+1]:=v[j]; Colocacin del valor j:=j-1 en su lugar correspondiente end; {while} v[j+1]:=aux end {for} END; {inserciondirecta}
INTERCAMBIO DIRECTO
Procedimiento: Recorre el vector v buscando el menor elemento desde la ltima posicin hasta la actual y lo inserta en dicha posicin.
INTERCAMBIO DIRECTO
1. Situar el elemento menor en la primera posicin.
Para ello se compara el ltimo elemento con el penltimo intercambiando los valores si estn en orden decreciente. Se repite esta operacin hasta llegar a la primera posicin. (el elemento menor se encuentra en la primera posicin).
3. Repetir este proceso con la tercera, cuarta,...,y con la ensima posicin intercambiando si procede en cada caso.
INTERCAMBIO DIRECTO,
IMPLEMENTACIN EN PASCAL
PROCEDURE Intercambiodirecto( var v:tvector); {Efecto. Se ordena v ascendentemente} VAR i, j:tIntervalo; aux:telem; BEGIN for i:=1 to N-1 do for j:=N downto i+1 {se busca el menor desde atrs y se sita en vi} if v[j-1]>v[j] then begin aux:=v[j]; v[j]:=v[j-1]; v[j-1]:=aux; end; {if} END; {intercambiodirecto}
Intercambio
ORDENACIN RPIDA
El algoritmo consiste en dividir el vector que se desea ordenar en dos bloques. En el primero se sitan todos los elementos que son menores que un cierto valor que se toma como referencia (pivote), mientras que en segundo iran el resto. Este procedimiento se repite dividiendo a su vez cada uno de estos bloques y repitiendo la operacin anteriormente descrita. La condicin de parada se da cuando el bloque que se desea ordenar est formado por un nico elemento (bloque ordenado). El esquema seguido por este algoritmo es el de divide y venceras.
ORDENACIN RPIDA,
IMPLEMENTACIN EN PASCAL
PROCEDURE Quicksort( var v:tvector); {Efecto. Se ordena v ascendentemente} PROCEDURE Sortdesdehasta(var v:tvector;izq,der:tintervalo); {Efecto. Se ordena v[izq..der] ascendentemente} {siguiente pgina} BEGIN {Quicksort} Sortdesdehasta(v,1,n); END; {Quicksort} PROCEDURE Sortdesdehasta(var v:tvector;izq,der:tintervalo); {Efecto. Se ordena v[izq..der] ascendentemente} VAR i, j:tIntervalo; p,aux:telem; BEGIN ............
ORDENACIN RPIDA,
IMPLEMENTACIN EN PASCAL
BEGIN i:=izq; j:=der; p:=v[(izq+der) DIV 2]; while i<j do begin {se reorganizan los vectores} while v[i]<p do i:=i+1; while p<v[j] do j:=j-1; if i j then begin {intercambio de elementos} aux:=v[i]; v[i]:=v[j]; Intercambio v[j]:=aux; i:=i+1; j:=j-1; {ajuste posiciones} end; {if} end; {while} if izq<j then sortdesdehasta(v, izq, j); if i<der then sortdesdehasta(v, i, der); END; {Sortdesdehasta}
ORDENACIN RPIDA,
TRAZA DE UN EJEMPLO
V=[0,5,15,9,11] 1. Sortdesdehasta(v,1,5) p=v[3]=15 i=1 [0,5,15,9,11] 0<15 i=2 [0,5,15,9,11] 5<15 i=3 [0,5,15,9,11] 15 not <15 i=3 j=5 [0,5,15,9,11] 11 not >15 i=4 j=4 [0,5,11,9,15] intercambio. Salida bucle 1.1.sortdesdehasta(v,1,4) p=v[2]=5 i=1 [0,5,11,9] 0<5 i=2 [0,5,11,9] 5 not< 5 i=2 j=4 [0,5,11,9] 9>5 i=2 j=3 [0,5,11,9] 11>5 i=2 j=3 [0,5,11,9] 5 not>5 i=3 j=1 [0,5,11,9] intercambio. Salida bucle
ORDENACIN RPIDA,
TRAZA DE UN EJEMPLO
1.1.1.sortdesdehasta(v,3,4) i=3 [11,9] i=4 [11,9] i=4 j=3 [9,11] p=v[3]=11 11 not <11 9 not> 11 intercambio. Salida bucle
V=[0,5,15,9,11] 1.2 Sortdesdehasta(v,4,5) p=v[4]=11 i=4 [11,15] 11 not <11 i=4 j=5 [11,15] 15>11 i=4 j=4 [11,15] 11 not >11 i=5 j=3 [11,15] intercambio. Salida bucle izq=4 not <j=3 i=5 not <der=5 termina recursin vector ordenado: [0,5,9,11,15]
ORDENACIN RPIDA,
TRAZA DE UN EJEMPLO
Sortdesdehasta(v,1,5)
Sortdesdehasta(v,1,4)
Sortdesdehasta(v,4,5)
Sortdesdehasta(v,3,4)
ORDENACIN RPIDA,
CLCULO DE SU COMPLEJIDAD ALGORTMICA
El peor caso: Si se elige como pivote el primer elemento del vector y adems se considera que el vector esta ordenado decrecientemente entonces, el bucle ... Para cada elemento... se ejecutar en total: (n-1)+(n-2)+(n-3)+....+1 Cada miembro de este sumando proviene de cada una de las sucesivas ordenaciones recursivas. Este sumatorio da lugar a la siguiente expresin:
(n
i=1
) = [(n
)+
2
1 ](n 1
(n
2
Que es de orden cuadrtico T(n)O(n2) Como se puede apreciar si la eleccin del pivote es tal que los subvectores son de igual tamao y adems los vectores estn ordenados de forma aleatoria entonces el algoritmo posee una eficiencia del tipo O(n log n).
Recorrido del vector Numero de divisiones
Donde dividir v en dos subvectores se puede refinar: Asignar a A el subvector [v1,.....,vnDIV2] Asignar a B el subvector [vnDIV2+1,......vn] Mientras que mezclar las ordenaciones de A y B consiste en ir entremezclando adecuadamente las componentes ya ordenadas de A y B.
V=[8,5,7,3] 1. Mergedesdehasta(v,1,4)centro=2 1.1. Izq(1) <centro(2) Mergedesdehasta(v,1,2) centro=1 1.1.1. izq(1) not< centro(1) 1.1.2. centro(1)< der(2) 1.1.2.1 izq(2) not< centro(2) 1.1.2.2. centro(2) not< der(2) 1.1.2.3. Merge(v,2,2,2,v) trivial Merge(v1,1,2,v)-------- w1[5,8]
Izq<centro 1<2 Mergedesdehasta(v,1,2) centro=1 Izq<centro Merge(v,1,1,2,v) 1not <1 Centro<der 1<2 Mergedesdehasta(v,2,2) centro=2 Izq<centro 2not <2 Merge(v,2,2,2,v) Centro< der 2 not <2
Izq<centro Merge(v,3,3,4,v) 3not <3 Centro<der 3<4 Mergedesdehasta(v,4,4) centro=4 Izq<centro 4not <4 Centro< der 4 not <4 Merge(v,4,4,4,v)
n = 1 n > 1
n + k
si
Esta ecuacin se resuelve mediante sustituciones sucesivas cuando n es una potencia de 2 (j tal que n=2j).
T ( n ) = 2 (2 T = 4T = 8T = 2
j
= 4 (2 T
(n
(n
(n
8
)+
8
(n
2 k k
2 2
)+
k 4
5
2 4
(n
= k =
)+
)+
2
n + k =
)+
)+
n + k
2
(n
)+
)+
2 k
n + k . =
3k jk
n + k
= ..........
..........
2
.......... n + k
j
..........
..........
T (1 ) +
De donde sustituyendo jlog n lo que da una funcin de orden O(n logn) (una vez aplicadas las reglas de la suma y de la escalabilidad).