Cap2.2 Ejercicios
Cap2.2 Ejercicios
Cap2.2 Ejercicios
FICCT
Semestre I/2018
Orden de crecimiento
T(N) = (1+N+1+N) + N = (2N +2)+ N =3N+2 Lineal.
vec[i]=1+rand()%(101-1); 1 * N
} T(n) = 3N+2
O(N)
}
Caso 2: Lineal
La complejidad de un algoritmo que invierte un vector
es Lineal, es decir O(n).
El numero de entradas N indicara el limite de las
iteraciones del algoritmo.
void mosinv(int *vec,unsigned int n){
for (int i=n-1;i>=0;i--) { 1 + N+1 + N
char tmp[10];
int x=vec[i];
3 * N
itoa(x,tmp,10);
MessageDlg(tmp,
mtConfirmation,
TMsgDlgButtons() << mbOK , 0); T(n) = 5N+2
O(N)
}
}
Caso 2: Lineal
Al invertir un vector.
¿Podemos de alguna forma disminuir el total de instrucciones ?
Al invertir un vector.
¿Podemos de alguna forma disminuir el total de instrucciones ?
- Mejora el T(n)
void invecII(int *vec,unsigned int n){ - Complejidad sigue LINEAL
unsigned int med=n/2;
unsigned int fin=n-1;
2
int aux;
for (unsigned int i=0; i <med; i++) { 1 + (N/2)+1 + N/2
aux=vec[i] ;
vec[i]=vec[fin];
4 * N/2
vec[fin]=aux;
fin=fin-1;
}
} T(n) = 3N + 4
O(N)
Caso 2: Lineal
Obsérvese el comportamiento de los siguientes algoritmos:
Supongamos en lenguaje C :
for i=1;i<=n; i++;
for j=1; j<=n; j++;
a=a+1;
¿Cual es la función T(N) del algoritmo? ¿Cual es el orden de crecimiento
del algoritmo?
insercion(t)
for i=1 to n
x= t[i]
j=i-1
while j > 0 and x<t[j]
t[j+1]=t[j]
j=j-1
t[j+1]=x
Caso 3: Cuadrático
Ordenación por Burbuja. Se basa en el principio de comparar e intercambiar
pares de elementos contiguos hasta que todos estén ordenados.
Desde el primer elemento hasta el penúltimo no ordenado comparar cada
elemento con su sucesor e intercambiar si no están en orden
Si en la primera PASADA se ordenara todo igual tendría que hacer las N pasadas.
pasada N J Inc J Com J
0 4 0 3 4
1
2
3
1 0 2 3
1
2
2 0 1 2
1
3
6 9
void ejer10(){
AnsiString Cadena;
for (int M = 1; M <= 10; M++)
{
for (int N = 1; N <= 10; N++)
Cadena += AnsiString(M) + "x" + AnsiString(N) + "=" + AnsiString(M*N) + " ";
Cadena += "\n";
}
ShowMessage(Cadena);
}
Caso 4: Cubico
void proMat(int **a, int **b, int **c, unsigned int n,unsigned int
m,unsigned int p)
{ unsigned int i,j,k;
for (i=0; i<n; i++)
for (j=0; j<m; j++)
{
c[i][j] = 0;
for (k=0; k<p; k++)
c[i][j] = c[i][j] + ( a[i][k] * b[k][j] );
}
}
Caso 5: Logaritmico
• El algoritmo de búsqueda binaria es de complejidad Logaritmica, es decir
O(ln n).
• Este algoritmo divide a la mitad al conjunto por cada iteración
• O (Log 2 N)
Recursión = Repetición
Es un algoritmo que se llama a si mismo para
solucionar el problema
El análisis recursivo de un algoritmo es normalmente casi directo y por simple
inspección, Para esto se busca representar el comportamiento del algoritmo
mediante una ecuación de recurrencia.
Una operación compleja se puede descomponer recursivamente en términos
más sencillos, para que los resultados parciales generen la solución del problema
completo. Así la función recursiva tiene 2 partes:
- Caso Base T(1)
- Caso Recursivo T(?) -
El caso recursivo es donde la función se llama a si mismo produciendo una
especie de repetición controlada por la variable de recursión. Es esto
justamente el comportamiento de esta variable la que define la ecuación de
recurrencia y como se representara la expresión algebraica buscada.
Si consideremos el siguiente problema para buscar un elemento t en
un arreglo A recursivamente:
T(x) = T(x/2) + 1
Si x=N => T(N) = T(N/2) + 1
Si x=N/2 => T(N/2) = T(N/4) + 1
Si x=N/4 => T(N/4) = T(N/8) + 1
Luego podemos reemplazar:
T(N) = T(N/2) + 1
= [ T(N/4) + 1 ] + 1 = T(N/4)+2
= [T(N/8) + 1 ] + 2 = T(N/ 23 )+ 3
Si: K = 3
= T(N/ 2k )+ K
Si: N/ 2k=1 => Aplicando logaritmos => k = ln n
= T(1)+(Ln n) = 1 + Ln n
O(Ln n )
http://segweb.blogspot.com/2012/03/recurrencia.html
http://segweb.blogspot.com/2012/03/recurrencia.html
Complejidad Recursivos: Tipo 4
If n<=1 return 1;
T(x) = 2T(x-1) + 1
Si x=N => T(N) = 2T(N-1) + 1
Si x=N-1 => T(N-1) = 2T(N-2) + 1
Si x=N-2 => T(N-2) = 2T(N-3) + 1
Luego podemos reemplazar:
T(N) = 2T(N-1) + 1
= 2 [2T(N-2) + 1 ] + 1 = 22 T(N-2)+3
= 22 [2T(N-3) + 1 ] + 3 = 23 T(N-3)+ 7 = 23 T(N-3)+ (23 -1)
Si: K = 3
= 2k T(N-k)+(2k -1)
Si: N-K=1
= 2k T(1)+(2k -1) = 2k +2k -1 = 2n-1
O(2n ).
Recursivo: Logarítmico-Lineal
Prerrequisito :
Comprender la Recursión
El MERGESORT consiste en :
Dividir los elementos en dos secuencias de la misma
longitud aproximadamente.
Ordenar de forma independiente cada sub-secuencia.
Mezclar las dos secuencias ordenadas para producir la
secuencia final ordenada.
6 2 9 4 3 8 6 1
Arbol Merge-Sort
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
7 2 9 4 2 4 7 9 3 8 6 1 1 3 8 6
7 2 2 7 9 4 4 9 3 8 3 8 6 1 1 6
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
mergeSort
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
7 2 2 7 9 4 4 9 3 8 3 8 6 1 1 6
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
629 4 2 4 7 9 3 8 6 1 1 3 8 6
mergeSort
622 7 9 4 4 9 3 8 3 8 6 1 1 6
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
622 7 9 4 4 9 3 8 3 8 6 1 1 6
mergeSort
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
622 7 9 4 4 9 3 8 3 8 6 1 1 6
mergeSort
Mezcla Merge
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
622 6 9 4 4 9 3 8 3 8 6 1 1 6
merge
Mezcla Merge
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
mergeSort
622 6 9 4 3 8 3 8 6 1 1 6
Mezcla Merge
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
622 6 9 4 3 8 3 8 6 1 1 6
mergeSort
Mezcla Merge
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
622 6 9 4 3 8 3 8 6 1 1 6
mergeSort
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 7 9 3 8 6 1 1 3 8 6
622 6 9 4 4 9 3 8 3 8 6 1 1 6
merge
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9
merge
622 6 9 4 4 9 3 8 6 1 1 6
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
mergeSort
6 29 4 2 4 6 9 3 8 6 1
622 6 9 4 4 9 3 8 6 1 1 6
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1
mergeSort
622 6 9 4 4 9 3 8 3 8 6 1 1 6
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1
622 6 9 4 4 9 3 8 3 8 6 1 1 6
mergeSort
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1
622 6 9 4 4 9 3 8 3 8 6 1 1 6
mergeSort
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1
622 6 9 4 4 9 3 8 3 8 6 1 1 6
merge
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1
mergeSort
622 6 9 4 4 9 3 8 3 8 6 1 6
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1
622 6 9 4 4 9 3 8 3 8 6 1 6
mergeSort
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1
622 6 9 4 4 9 3 8 3 8 6 1 6
mergeSort
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1 |
622 6 9 4 4 9 3 8 3 8 6 1 1 6
merge
6 2 9 43 8 6 1 1 2 3 4 6 7 8 9
6 29 4 2 4 6 9 3 8 6 1 1 3 6 8
merge
622 6 9 4 4 9 3 8 3 8 6 1 1 6
Mezcla
6 2 9 43 8 6 1 1 2 3 4 6 6 8 9
merge
6 29 4 2 4 6 9 3 8 6 1 1 3 6 8
622 6 9 4 4 9 3 8 3 8 6 1 1 6
void merge (int *A, unsigned int bajo, unsigned int bajo_2,
unsigned int alto,unsigned int n) {
unsigned int i = bajo; //Variable de 1ro elemento de la 1ra subsecuencia
unsigned int finbajo = bajo_2 -1; // Ultimo elemento de la 1ra subsecuencia
unsigned int j = bajo_2; //1ro elemento de la 2da subsecuencia
unsigned int k = bajo;
int *Temp=new int[n]; /* Temp es un array ya definido*/
while (( i <= finbajo) && (j<= alto))
{
if (A[i] <= A[j]) Temp[k++] = A[i++];
else Temp[k++] = A[j++];
}
MergeSort
while (i <= finbajo) //Si se agotan todos los elementos de la 2da subsec
Temp[k++] = A[i++];
while (j <= alto) //Si se agotaron los de la 1ra subsecuecia
Temp[k++] = A[j++];
//Paso todos los elementos del Temp al array A
for (i = bajo; i <= alto; i++)
A[i] = Temp[i];
}
MergeSort – Complejidad O
Suponemos n potencia de 2
n = 2K
log2 n = K
Tiempo de Ordenación
Para N = 1, Tiempo constante.
Para N > 1, El tiempo de ordenación para n números
es igual al tiempo para:
• 2 ordenaciones recursivas de tamaño n/2
• El tiempo para mezclar (que es lineal)
Por tanto,
T(n) = 2 T(n/2) + n
MergeSort – Complejidad O
(1) if n 1
T ( n)
T ( n / 2) T ( n / 2) (n) if n 1
T (n) 2 * T (n / 2) (n)
2 * 2 * T (n / 4) (n / 2) (n)
2 * T (n / 2 ) 2 * (n / 2) (n)
2 2
2
3 2
2 * 2 * T ( n / 2 ) ( n / 2 ) ( n ) ( n )
2 * T ( n / 2 ) 2 * ( n / 2 ) 2 * ( n )
3 3 2 2
2 * T (n / 2 ) 4 * (n / 4) 2 * (n)
3 3
2 * T ( n / 2 ) 3 * ( n )
3 3
2 k * T ( n / 2 k ) k * ( n )
MergeSort – Complejidad O
T ( n) n * (1) log 2 n * ( n)
n *1 log 2 n * n
n n log 2 n
n(1 log 2 n)
n(log 2 n)
( n log 2 n)
MergeSort – Complejidad O
Por que ?
Recursivo: Cuadrático
0 1 2 3 4 5 6 7
7 6 2 10 4 5 9 8 Pivote
Como 10 es mayor que 8 este no esta en una posición correcta. Luego debemos
continuar avanzando con i hasta encontrar uno menor que el pivote 8.
Índice
ini i Pivote Fin
0 1 2 3 4 5 6 7
7 6 2 10 4 5 9 8 Pivote
Como 10 es mayor que 8 este no esta en una posición correcta. Luego debemos continuar
avanzando con i hasta encontrar uno menor que el pivote 8.
Índice
ini Pivote i Fin
0 1 2 3 4 5 6 7
7 6 2 10 4 5 9 8 Pivote
0 1 2 3 4 5 6 7
7 6 2 4 10 5 9 8 Pivote
Como 10 es mayor que 8 este no esta en una posición correcta. Luego debemos
continuar avanzando con i hasta encontrar uno menor que el pivote 8.
Índice
ini Pivote i Fin
0 1 2 3 4 5 6 7
7 6 2 4 10 5 9 8 Pivote
Índice
ini Pivote i Fin
0 1 2 3 4 5 6 7
7 6 2 4 5 10 9 8 Pivote
0 1 2 3 4 5 6 7
7 6 2 4 5 10 9 8 Pivote
Como 10 es mayor que 8 este no esta en una posición correcta. Luego
debemos continuar avanzando con i hasta encontrar uno menor que el pivote 8.
El apuntador i llego a su posición máxima. Finalmente hay que mover el pivote 8 a la posición donde quedo el
apuntador indicepivote ya que este es mayor y debe ir a la derecha.
Índice
ini Pivote Fin
0 1 2 3 4 5 6 7
7 6 2 4 5 10 9 8 Pivote
Índice
ini Pivote Fin
0 1 2 3 4 5 6 7
7 6 2 4 5 8 9 10
Pivote
El algoritmo termina poniendo el Pivote en su posición de ordenación correcta y al mismo tiempo divide al conjunto en
2 para continuar ordenando
Árbol QuickSort
partición
Árbol QuickSort
quickSort (I)
Árbol QuickSort
Partir (2)
0 1 2 3 4
7 6 2 4 5 ip piv ini fin i
0 5 0 4 0
1 1
0 1 2 3 4 2 2
2 6 7 4 5 3
4
0 1 2 3 4
2 4 7 6 5
0 1 2 3 4
2 4 5 6 7
Árbol QuickSort
partición
Árbol QuickSort
Partir (3)
0 1
2 4 ip piv ini fin i
0 4 0 1 0
1 1
0 1
2 4
0 1
2 4
Árbol QuickSort
quickSort (I)
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
Árbol QuickSort
Árbol QuickSort
quickSort (D)
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
Árbol QuickSort
Árbol QuickSort
Árbol QuickSort
quickSort (D)
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
partición
Árbol QuickSort
Árbol QuickSort
QuickSort
}
QuickSort
(1) if n 1
T ( n)
T (1) T ( n 1) (n) if n 1
T(N) = T(N-1) + N
= T(N-2) + (N-1) + N
= T(N-3) + (N-2) + (N-1) + N
Si: N-3 =K
= T(N-K) + (N-K+1) + (N-K+2) + (N-K+3)
Si N-K=1
= T(1) + (2) + (3) +(4)
=1 + 2 + 3 + 4 +N
T(N) = N (N+1) /2
O(n2).
Caso 7: Exponenciales
Caso 7: Complejidad Exponencial
Texto electrónico
http://www.lcc.uma.es/~av/Libro/CAP1.pdf