Académique Documents
Professionnel Documents
Culture Documents
ALGORITMOS
APUNTES 2 CURSO GRADO EN INGENIERA INFORMTICA
UDC (UNIVERSIDAD DE LA CORUA)
(AO 2016-2017)
TEMAS Y ALGORITMOS:
TEMA 1: ANLISIS DE ALGORITMOS . 2-4
ANLISIS 2
EJEMPLO DETALLADO 3
RECURRENCIAS 4
TEMA 2: ESTRUCTURAS DE DATOS ......5-19
PILA 5
COLA 6
LISTA 7
RBOL BINARIO BSQUEDA 8
MONTCULOS 11
TABLAS DISPERSIN 13
INTRODUCCIN A GRAFOS 16
CONJUNTOS DISJUNTOS 17
TEMA 3: ALGORITMOS SOBRE SECUENCIAS Y CONJUNTOS DE DATOS......20-26
ORDENACIN:
INSERCIN 20
SELECCIN 20
SHELL 21
ORDENACIN POR MONTCULO 22
MERGESORT 23
QUICKSORT 24
OTROS:
SUMA SUBSECUENCIA MXIMA 25
BSQUEDA BINARIA 26
TEMA 4: ALGORITMOS VORACES........27-32
PROBLEMA DE LA MOCHILA (VORAZ) 27
ORDENACIN TOPOLGICA 28
RBOL EXPANDIDO MNIMO (KRUSKAL Y PRIM) 29
CAMINOS MNIMOS (DIJKSTRA) 31
TEMA 5: ALGORITMOS DIVIDE-VENCERS Y PROGRAMACIN DINMICA....33-34
TEMA 6: EXPLORACIN SOBRE GRAFOS (RECORRIDOS PROFUNDIDAD Y ANCHURA)....35-36
TEMA 7: COMPLEJIDAD COMPUTACIONAL..37
TABLA RESUMEN COMPLEJIDADES....38
4. BUCLES:
I. PARA: para i=1 hasta n hacer secuencia fin para
partiendo de i=1*
{11}fin procedimiento
ANLISIS DETALLADO:
COMENZAMOS POR LA SECUENCIA INTERIOR DEL BUCLE MS INTERNO, {6} Y {7}. LA
SECUENCIA ES DE COMPLEJIDAD O(1) DEBIDO A QUE AMBAS SON OPERACIONES
ELEMENTALES DE ASIGNACIN CON VALOR CONSTANTE (REGLA 1).
EL BUCLE MAS INTERNO, {5}, TIENE COMO MTODO DE COMPROBACIN 2
COMPARACIONES LAS CUALES SIGUEN COMPLEJIDAD CONSTANTE, O(1). EL NMERO
DE INTERACCIONES DE ESTE BUCLE ES n POSIBLES. POR TANTO, LA COMPLEJIDAD DEL
BUCLE INTERNO ES O(1) * n = O(n) (REGLA 4).
EL RESTO DE LINEAS DEL BUCLE MAS EXTERIOR, {3},{4},{9}, SON DE NUEVO
ASIGNACIONES DE COMPLEJIDAD CONSTANTE Y, POR LA REGLA 2, TODAS ELLAS
SUMAN TIEMPO CONSTANTE. POR ESTO, EL INTERIOR DEL BUCLE PARA SIGUE EL
ORDEN DE O(n), EL MXIMO DE SUS SUBSECUENCIAS (REGLA 2).
PARA FINALIZAR, EL NMERO DE INTERACCIONES DEL BUCLE PARA, {2}, ES DE n-1
INTERACCIONES (DE 2 A N) Y POR LA REGLA 4, O(n) * n = O(n2).
PODEMOS CONCLUIR QUE EL ALGORITMO PRESENTADO ES DE COMPLEJIDAD DE
O(n2).
5. RECURSIVIDAD:
T(n) = T(n/b)+cnk;
n>n0
COMPLEJIDAD
LA COMPLEJIDAD DE ESTE ALGORITMO ES CONSTANTE, YA QUE EN TODAS SUS
FUNCIONES SOLO EXISTEN OPERACIONES ELEMENTALES EN SUS SUBSECUENCIAS.
POR TANTO LA IMPLEMENTACIN DE UNA PILA ES DE ORDEN O(1).
2. COLAS:
DENUEVO SU IMPLEMENTACIN REQUIERE 3 FUNCIONES BSICAS DE INSERTAR,
ELIMINAR Y CABEZA.
SU IMPLEMENTACIN EN BASE A VECTORES ES ESTA:
PSEUDOCDIGO
tipo
Cola = registro
Cabeza_de_cola, Final_de_cola:1..Tamano_maximo_de_cola
Tamano_de_cola : 0..Tamano_maximo_de_cola
Vector_de_cola : vector [1..Tamano_maximo_de_cola] de
Tipo_de_elemento
fin registro
procedimiento Crear_Cola ( C )
C. Tamano_de_cola := 0;
C. Cabeza_de_cola := 1;
C. Final_de_cola := Tamano_maximo_de_cola
fin procedimiento
funcin Cola_Vaca ( C ) : test
devolver C. Tamano_de_cola = 0
fin funcin
procedimiento incrementar ( x ) (* privado *)
si x = Tamano_maximo_de_cola entonces
x := 1
sino
x := x + 1
fin procedimiento
procedimiento Insertar_en_Cola ( x, C )
si
C. Tamano_de_Cola = Tamano_maximo_de_cola entonces
error Cola llena
sino
C. Tamano_de_cola := C. Tamano_de_cola + 1;
incrementar(C. Final_de_cola);
C. Vector_de_cola[C. Final_de_cola] := x;
fin procedimiento
funcin Quitar_Primero ( C ) : Tipo_de_elemento
si Cola_Vaca ( C ) entonces
error Cola vaca
sino
C. Tamano_de_cola := C. Tamano_de_cola - 1;
x := C. Vector_de_cola[C. Cabeza_de_cola];
incrementar(C. Cabeza_de_cola);
devolver x
fin funcin
COMPLEJIDAD
DE NUEVO, LA COMPLEJIDAD DE LA IMPLEMENTACIN DE LAS COLAS ES DE O(1),
COMPLEJIDAD CONSTANTE.
3.
LISTAS:
(* privada *)
COMPLEJIDAD
LA COMPLEJIDAD DE ESTA ESTRUCTURA ES LINEAL EN VISUALIZAR, BUSCAR
POSICIN Y BUSCAR ELEMENTO, DEBIDO A QUE EN VISUALIZAR HACE FALTA
MOSTRAR LOS n NODOS DE LA LISTA Y EN BUSCAR, EN SU PEOR CASO, HABRIA QUE
RECORRER LOS n NODOS Y, EN EL CASO MEDIO, n/2. POR TANTO COMPLEJIDAD O(n).
LAS DEMS FUNCIONES Y PROCEDIMIENTOS SON DE ORDEN CONSTANTE YA QUE
NEW Y DISPOSE SON DE COMPLEJIDAD O(1), AUNQUE CABE DESTACAR QUE
ELIMINAR TIENE O(n) YA QUE LLAMA A LA FUNCIN PRIVADA BUSCAR_ANTERIOR
QUE ES DE ORDEN LINEAL.
4.
PSEUDOCDIGO:
tipo
PNodo = Nodo
Nodo = registro
Elemento : TipoElemento
Izquierdo, Derecho : PNodo
fin registro
ABB = PNodo
procedimiento CrearABB ( var A)
A := nil
fin procedimiento
funcin Buscar (x, A) : PNodo
si A = nil entonces
devolver nil
sino
si x = A.Elemento entonces
devolver A
sino
si x < A.Elemento entonces
devolver Buscar (x, A.Izquierdo)
sino
devolver Buscar (x, A.Derecho)
fin funcin
funcin BuscarMin (A) : PNodo
si A = nil entonces
devolver nil
sino
si A.Izquierdo = nil entonces
devolver A
sino
devolver BuscarMin (A.Izquierdo)
fin funcin
RECORRIDOS DE UN RBOL:
EN-ORDEN: HIJO IZDO RAZ HIJO DER
procedimiento Visualizar (A)
si A <> nil entonces
Visualizar (A.Izquierdo);
Escribir (A.Elemento);
Visualizar (A.Derecho)
fin procedimiento
10
ALTURA DE UN RBOL:
funcin Altura (A) : numero
si A = nil entonces
devolver -1
sino
devolver (1 + max (Altura (A.Izquierdo),
Altura (A.Derecho)))
fin funcin
COMPLEJIDAD:
CREAR UN RBOL ES UNA OPERACIN, POR TANTO ES DE ORDEN CONSTANTE.
EN EL RESTO DE FUNCIONES DEL RBOL, EL CASO MEDIO DICTA QUE LA
COMPLEJIDAD ES O(logn), SIENDO EN EL PEOR CASO LINEAL.
5.
MONTCULOS:
11
M, i )
(* privado *)
2*i;
2*i+1;
12
COMPLEJIDAD:
AMBAS OPERACIONES PRINCIPALES SE REALIZAN CON UNA COMPLEJIDAD DE
O(logn) EN EL PEOR CASO.
O(k)
6.
TABLAS DE DISPERSIN
13
ABIERTA:
14
COMPLEJIDAD
EVALUAR LA FUNCIN DE DISPERSIN ES O(1), PERO LA LISTA SE RECORRE EN
TIEMPO LINEAL O() EN EL PEOR CASO.
CERRADA:
15
7.
GRAFOS:
(MS ADELANTE)
16
7.
17
COMPLEJIDAD:
LA BSQUEDA ES EVIDENTEMENTE CONSTANTE O(1), MIENTRAS QUE LA UNIN ES
O(n) SEA CUAL SEA EL CONJUNTO, AUNQUE SI LA UNIN ES DE TODO EL CONJUNTO
LLEGARA A SER O(n2).
MODO RBOL:
SE PUEDE HACER UNA IMPLEMENTACIN DE RBOL, MANTENIENDO AL
REPRESENTANTE COMO RAZ Y PARTIENDO DE L EL RESTO DE ELEMENTOS.
Funcion Buscar2 (C, x) : Conj
r := x;
mientras C[r] <> r hacer
r := C[r]
fin mientras;
devolver r
fin funcin
procedimiento Unir2 (C, raz1, raz2)
si raz1 < raz2 entonces
C[raz2] := raz1
sino
C[raz1] := raz2
fin procedimiento
COMPLEJIDAD:
LA BSQUEDA TIENE UNA COMPLEJIDAD DE O(n) EN SU PEOR CASO, MIENTRAS QUE
LA UNIN ES CONSTANTE.
UNIN POR ALTURAS COMPLEJIDAD O(logn)
procedimiento Unir3 (C, A, raz1, raz2)
{supone que raz1 y raz2 son races}
si A[raz1] = A[raz2] entonces
A[raz1] := A[raz1] + 1;
C[raz2] := raz1
sino
si A[raz1] > A[raz2] entonces
C[raz2] := raz1
sino
C[raz1] := raz2
fin procedimiento
18
19
INSERCIN:
PSEUDOCDIGO:
procedimiento Ordenacion por Insercion (var T[1..n])
para i:=2 hasta n hacer
x:=T[i];
j:=i-1;
mientras j>0 y T[j]>x hacer
T[j+1]:=T[j];
j:=j-1
fin mientras;
T[j+1]:=x
fin para
fin procedimiento
COMPLEJIDAD:
PEOR CASO= O(n2) debido a que recorre todo el array buscando el elemento a ordenar y
ordenando los elementos anteriores.
MEJOR CASO= O(n) debido a que comprueba que cada uno est en la posicin indicada
CASO MEDIO= O(n2)
SELECCIN:
20
PSEUDOCDIGO:
procedimiento OrdenacinporSeleccin (var T[1..n])
para i:=1 hasta n1 hacer
minj:=i;
minx:=T[i];
para j:=i+1 hasta n hacer
si T[j]<minx entonces
minj:=j;
minx:=T[j]
fin si
fin para;
T[minj]:=T[i];
T[i]:=minx
fin para
fin procedimiento
COMPLEJIDAD:
SU COMPLEJIDAD ES O(n2)
SHELL:
GRACIAS A LA PROPIEDAD DE un vector hk-ordenado que se hk1-ordena sigue estando hkordenado PODEMOS ASEGURAR QUE ESTE ALGORITMO FUNCIONA.
TRATA DE, PARTIENDO DE UNOS INCREMENTOS PREVIAMENTE PACTADOS, IR
ORDENANDO SUBSECUENCIAS DE DATOS PARA, AL FINAL, OBTENER LA SECUENCIA
ORDENADA.
LOS INCREMENTOS MS FAVORABLES SON:
-
21
PSEUDOCDIGO:
procedimiento OrdenaciondeShell (var T[1..n])
incremento := n;
repetir
incremento := incremento div 2;
para i := incremento+1 hasta n hacer
tmp := T[i];
j := i;
seguir := cierto;
mientras j-incremento > 0 y seguir hacer
si tmp < T[j-incremento] entonces
T[j] := T[j-incremento];
j := j-incremento
sino
seguir := falso ;
T[j] := tmp
fin mientras
fin para
hasta incremento = 1
fin procedimiento
COMPLEJIDAD:
DEPENDIENDO DE LOS INCREMENTOS: PARA INCREMENTOS SHELL O(n2) EN EL
PEOR CASO
MONTCULOS:
22
COMPLEJIDAD:
LA COMPLEJIDAD ES DE O(nlogn) DEBIDO A QUE ELIMINAR EN EL MONTCULO ES LA
OPERACIN CON LA COMPLEJIDAD MAYOR EN TODO ESTE ALGORITMO.
FUSIN O MERGESORT:
COMPLEJIDAD:
POR SER RECURSIVA Y UN ALGORITMO DIVIDE Y VENCERS, SE APLICA LAS
RECURRENCIAS DIVIDE VENCERS.
T(n) = T([n/2]) + T([n/2]) + O(n) (* fusin de elementos *)
23
PSEUDOCDIGO:
procedimiento Qsort (var T[i..j] )
si i+UMBRAL <= j entonces
Mediana 3 ( T[i..j] ) ;
pivote := T[j-1] ; k := i ; m := j-1 ;
{solo con Mediana 3}
repetir
repetir k := k+1 hasta T[k] >= pivote ;
repetir m := m-1 hasta T[m] <= pivote ;
intercambiar ( T[k], T[m] )
hasta m <= k ;
intercambiar ( T[k], T[m] ) ;
{deshace el ultimo intercambio}
intercambiar ( T[k], T[j-1] ) ; {pivote en posicion k}
Qsort ( T[i..k-1] ) ;
Qsort ( T[k+1..j] )
fin procedimiento
procedimiento Quicksort ( var T[1..n] )
Qsort ( T[1..n] ) ;
Ordenacion por Insercion ( T[1..n] )
fin procedimiento
(* FUERA DE UMBRAL *)
COMPLEJIDAD:
PEOR CASO: O(n2)
CASO MEDIO: O(nlogn)
MEJOR CASO: O(nlogn) NICO EN EL QUE PODEMOS APLICAR LA
RECURRENCIA DIVIDE VENCERS
25
COMPLEJIDAD:
COMPLEJIDAD:
PSEUDOCDIGO:
COMPLEJIDAD:
OBJETIVO
1) PROBLEMA DE LA MOCHILA
TRATA DE METER EN UNA MOCHILA CON DETERMINADO PESO MXIMO W EL
MAYOR VALOR DE LOS ELEMENTOS POSIBLE. CADA ELEMENTO TIENE UN VALOR V
Y UN PESO W.
EN ESTE CASO, LA MEJOR SOLUCIN ES QUE NUESTRA FUNCIN DE SELECCIN SEA
TENIENDO EN CUENTA EL MS RENTABLE, ES DECIR, V/W MXIMO.
27
PSEUDOCDIGO:
COMPLEJIDAD:
PSEUDOCDIGO:
28
COMPLEJIDAD:
PSEUDOCDIGO:
COMPLEJIDAD:
PRIM:
PSEUDOCDIGO:
30
COMPLEJIDAD:
CAMINOS MNIMOS:
ENCONTRAR LOS CAMINOS MNIMOS NECESARIOS PARA LLEGAR DESDE EL ORIGEN
A TODOS LOS NODOS.
ALGORITMO DE DIJKSTRA VORAZ
FUNCIN DE SELECCIN NODO CON MENOR DISTANCIA CONOCIDA DESDE 1
UN CAMINO ES ESPECIAL SI TODOS SUS NODOS INTERMEDIOS PERTENECEN A LA
SOLUCIN. POR TANTO, EL CAMINO ESPECIAL MNIMO = CAMINO MNIMO.
PSEUDOCDIGO:
COMPLEJIDAD:
31
PROGRAMACIN DINMICA:
DIVIDE-VENCERS TIENE UN PROBLEMA INEFICIENTE, LLEGAR A VARIOS SUBCASOS
IGUALES, EN CUYO CASO SE RESUELVEN POR SEPARADO PESE QUE LA SOLUCIN ES
IDNTICA: FIBONACCI, POR EJEMPLO.
LA PROGRAMACIN DINMICA GUARDA LOS RESULTADOS Y LOS CONTRASTA,
OPERANDO CADA CASO 1 NICA VEZ.
PROGRAMACIN DINMICA O(logn)
DIVIDE-VENCERS O(n)
LOS ALGORITMOS VORACES SON EFICIENTES, PERO EXISTEN CASOS EN LOS QUE NO
ENCUENTRAN LA SELECCIN PTIMA DE CANDIDATOS.
POR EJEMPLO, EN EL PROBLEMA DE DEVOLVER EL CAMBIO, EL ALGORITMO VORAZ
NO ES PTIMO SEGN EL SISTEMA MONETARIO QUE USEMOS. CON EL CONJUNTO DE
MONEDAS C={1,4,6} EL ALGORITMO VORAZ FALLA. POR ELLO USAMOS LA
PROGRAMACIN DINMICA DE LA SIGUIENTE MANERA:
DEVOLUCIN DEL CAMBIO PROGRAMACIN DINMICA:
PSEUDOCDIGO:
COMPLEJIDAD:
O(mn)
RESOLUCIN INTUITIVA:
CONSEGUIR EL VALOR 8 CON UN SISTEMA MONETARIO C={1,4,6}, SIENDO EL VORAZ 3
MONEDAS: {6,1,1}
33
PSEUDOCDIGO:
COMPLEJIDAD:
O(nW).
LA PROGRAMACIN DINMICA NO ES SIEMPRE APLICABLE, AUNQUE EN MUCHOS
CASOS AUMENTA LA OPTIMIZACIN DE PROBLEMAS.
34
procedimiento rp (v)
(*)
marca[v] := visitado;
para cada w adyacente a v hacer
si marca[w] != visitado entonces
rp(w)
fin procedimiento
COMPLEJIDAD:
O(n+m).
*
visita := visita+1;
preorden[v] := visita;
35
II.
ANCHURA:
procedimiento ra (v)
Crear Cola (C); marca[v] := visitado; Insertar Cola (v,C);
mientras no Cola Vaca (C) hacer
u := Eliminar Cola (C);
para cada nodo w adyacente a u hacer
si marca[w] != visitado entonces
marca[w] := visitado; Insertar Cola (w,C)
fin si
fin para
fin mientras
fin procedimiento
COMPLEJIDAD:
III.
EJEMPLOS:
1
5
- APILAMOS EL 3
- APILAMOS EL 2
- APILAMOS EL 5
- APILAMOS EL 4
SOLUCIN: 1,3,2,5,4
ANCHURA (COLA) PARTIENDO DE NODO 1
4
2
36
- INTRODUCIMOS EN LA COLA EL 3 Y EL 5
(ORDEN DE MENOR A MAYOR, INDIFERENTE). VISITAMOS EL NODO 3 (PRIMERO DE LA COLA)
Y ALMACENAMOS EL 2.
- VISITAMOS EL NODO 5 (PRIMERO DE LA COLA)
Y ALMACENAMOS SUS ADYACENTES (4)
- VISITAMOS EL 2 SIN ADYACENTES
- VISITAMOS EL 4 SIN ADYACENTES
SOLUCIN: 1,3,5,2,4
CASO
EXPLICACIN
COMPLEJIDAD
INSERCIN
MEDIO/PEOR
MEJOR
DESORDENADO
ORDENADO
O(n2)
O(n)
SELECCIN
TODOS
SIEMPRE
O(n2)
SHELL
TODOS
O(n2)
ORD. MONTCULO
TODOS
SIEMPRE
O(nlogn)
FUSIN
TODOS
SIEMPRE
O(nlogn) T(n)=2T(n/2)+n
QUICKSORT
MEJOR
PIVOTE =
MEDIANA EXACTA
NUNCA COINCIDE
COINCIDE A VECES
O(nlogn) T(n)=2T(n/2)+cn
PEOR
MEDIO
O(n2) *
O(nlogn) *
BUSQUEDA BIN.
PEOR
NO EST/LTIMA
LLAMADA REC.
O(logn) T(n)=T(n/2)+1
S.S.M
RECURSIVA
EN LNEA
------------
O(nlogn) T(n)=2T(n/2)+n
O(n)
ORDENACIN
TOPOLGICA
PEOR
MEJOR
MEDIO
------------
O(n2)
O(n)
O(n+m)
KRUSKAL
TODOS
SIEMPRE
O(mlogn)
PRIM
TODOS
SIEMPRE
O(n2)
DIJKSTRA
TODOS
SIEMPRE
O(n2)
MONEDAS P.D.
TODOS
SIEMPRE
O(n*m)
MOCHILA
VORAZ
P.D.
-------------
O(nlogn)
O(n*W)
EXPLORACIN DE GRAFOS
PROFUNDIDAD
TODOS
SIEMPRE
O(n+m)
ANCHURA
TODOS
SIEMPRE
O(n+m)
38