Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Algoritmos y estructuras de datos, recursion
1. Algoritmos y Estructuras de Datos
Cursada 2021
Cursada 2021
Prof. Alejandra Schiavoni (ales@info.unlp.edu.ar)
Prof. Catalina Mostaccio (catty@lifia.info.unlp.edu.ar)
Prof. Catalina Mostaccio (catty@lifia.info.unlp.edu.ar)
Prof. Laura Fava (lfava@info.unlp.edu.ar)
Prof. Laura Fava (lfava@info.unlp.edu.ar)
Prof. Pablo Iuliano (piuliano@info.unlp.edu.ar)
3. Repaso de Recursión
Repaso de Recursión
Se dice que un objeto es recursivo cuando forma
parte de sí mismo, es decir puede definirse en
parte de sí mismo, es decir puede definirse en
términos de sí mismo.
En programación, la recursividad es la propiedad
que tienen los Algoritmos de llamarse a sí
que tienen los Algoritmos de llamarse a sí
mismos para resolver un problema.
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
4. Repaso de Recursión
Repaso de Recursión
Ejemplos de definiciones recursivas:
• Factorial de un número
• Factorial de un número
0! = 1
Si n > 0, n! = n * (n-1)!
• Potencia de un número
x0 = 1
x = 1
Si y > 0, xy = x * xy-1
• Estructuras de datos
• Estructuras de datos
Árboles
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
5. Repaso de Recursión
Repaso de Recursión
Ejemplos de soluciones recursivas:
• Buscar un elemento en un arreglo
• Ordenar un arreglo de elementos
• Recorrer un árbol
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
6. Repaso de Recursión
Repaso de Recursión
Soluciones recursivas:
• División sucesiva del problema original en problemas más
pequeños del mismo tipo
• Se van resolviendo estos problemas más sencillos
• Con las soluciones de éstos se construyen las soluciones
de los problemas más complejos
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
7. Repaso de Recursión
Ejemplo:
Repaso de Recursión
Ejemplo:
Programar un algoritmo recursivo que permita invertir un número
int invertir (int n)
{
{
if (n < 10) //caso base
System.out.print(n);
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la división entera
invertir (n div 10);
}
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
8. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (n div 10);
}
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida:
9. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (n div 10);
}
invertir (123)
n = 123
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3
10. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (12)
invertir (n div 10);
}
invertir (12)
n = 12
print (2)
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
invertir (1)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3 2
11. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
invertir (1)
n = 1
print (1)
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (12) invertir (12)
print (1) invertir (n div 10);
}
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
invertir (1) invertir (1)
invertir (123)
n = 123
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3 2 1
12. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
invertir (1)
n = 1
print (1)
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (12) invertir (12)
print (1) invertir (n div 10);
}
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
invertir (1) invertir (1)
invertir (123)
n = 123
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3 2 1
13. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
invertir (1)
n = 1
print (1)
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (12) invertir (12)
print (1)
invertir (12)
invertir (n div 10);
}
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
invertir (1) invertir (1)
invertir (123)
n = 123
invertir (1)
invertir (123)
n = 123
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3 2 1
14. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
invertir (1)
n = 1
print (1)
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (12) invertir (12)
print (1)
invertir (12)
invertir (n div 10);
}
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
invertir (1) invertir (1)
invertir (123)
n = 123
invertir (1)
invertir (123)
n = 123
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3 2 1
15. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
invertir (1)
n = 1
print (1)
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (12) invertir (12)
print (1)
invertir (12)
invertir (n div 10);
}
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
invertir (1) invertir (1)
invertir (123)
n = 123
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3 2 1
16. Repaso de Recursión
int invertir (int n)
Ejecución:
int invertir (int n)
{
if (n < 10) //caso base
System.out.print(n);
invertir (1)
n = 1
print (1)
Entrada: 123
System.out.print(n);
else
System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
invertir (12) invertir (12)
print (1)
invertir (12)
invertir (n div 10);
}
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (12)
n = 12
print (2)
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
invertir (1) invertir (1)
invertir (123)
n = 123
invertir (1)
invertir (123)
n = 123
invertir (123)
n = 123
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
n = 123
print (3)
invertir (12)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Salida: 3 2 1
17. Repaso de Recursión
Ejemplo 2: Algoritmo de ordenación MergeSort
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
vectores), ordenarlos y luego hacer un Merge de estos sub-vectores ya
ordenados. Cada uno de esos sub-vectores se ordenan aplicando la misma
ordenados. Cada uno de esos sub-vectores se ordenan aplicando la misma
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
Características recursivas del algoritmo
Se resuelven 2 sub-problemas más pequeños
Se resuelven 2 sub-problemas más pequeños
Se combinan los resultados de cada solución
Se cuenta con un caso base.
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
18. Repaso de Recursión
Ejemplo 2: Algoritmo de ordenación MergeSort
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
vectores), ordenarlos y luego hacer un Merge de estos sub-vectores ya
ordenados. Cada uno de esos sub-vectores se ordenan aplicando la misma
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
devuelve (el sub-vector está ordenado).
Gráficamente:
Ordenar vector
Ordenar sub-vector Ordenar sub-vector
Ordenar sub-vector
izquierdo
Ordenar sub-vector
derecho
sub-vector derecho
sub-vector izquierdo sub-vector derecho
ordenado
sub-vector izquierdo
ordenado
Merge de los 2 sub-
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Merge de los 2 sub-
vectores ordenados
19. Repaso de Recursión
Ejemplo 2: Algoritmo de ordenación MergeSort
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
vectores), ordenarlos y luego hacer un Merge de estos sub-vectores ya
ordenados. Cada uno de esos sub-vectores se ordenan aplicando la misma
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
devuelve (el sub-vector está ordenado).
Gráficamente:
Ordenar vector
Ordenar sub-vector Ordenar sub-vector
Dividir en 1 o varios sub-
problemas
Problema
Ordenar sub-vector
izquierdo
Ordenar sub-vector
derecho
sub-vector derecho
sub-vector izquierdo sub-vector derecho
ordenado
sub-vector izquierdo
ordenado
Merge de los 2 sub-
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Merge de los 2 sub-
vectores ordenados
20. Repaso de Recursión
Ejemplo 2: Algoritmo de ordenación MergeSort
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
vectores), ordenarlos y luego hacer un Merge de estos sub-vectores ya
ordenados. Cada uno de esos sub-vectores se ordenan aplicando la misma
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
devuelve (el sub-vector está ordenado).
Gráficamente:
Ordenar vector
Ordenar sub-vector Ordenar sub-vector
Dividir en 1 o varios sub-
problemas
Problema
Ordenar sub-vector
izquierdo
Ordenar sub-vector
derecho
sub-vector derecho
sub-vector izquierdo
Resolver los sub-
problemas
sub-vector derecho
ordenado
sub-vector izquierdo
ordenado
Merge de los 2 sub-
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Merge de los 2 sub-
vectores ordenados
21. Repaso de Recursión
Ejemplo 2: Algoritmo de ordenación MergeSort
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
vectores), ordenarlos y luego hacer un Merge de estos sub-vectores ya
ordenados. Cada uno de esos sub-vectores se ordenan aplicando la misma
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
devuelve (el sub-vector está ordenado).
Gráficamente:
Ordenar vector
Ordenar sub-vector Ordenar sub-vector
Dividir en 1 o varios sub-
problemas
Problema
Ordenar sub-vector
izquierdo
Ordenar sub-vector
derecho
sub-vector derecho
sub-vector izquierdo
Resolver los sub-
problemas
sub-vector derecho
ordenado
sub-vector izquierdo
ordenado
Merge de los 2 sub-
Combinar las soluciones
de los sub-problemas
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Merge de los 2 sub-
vectores ordenados
de los sub-problemas
22. Repaso de Recursión
Ejemplo 2: Algoritmo de ordenación MergeSort
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
La estrategia del algoritmo consiste en dividir el vector en 2 partes (sub-
vectores), ordenarlos y luego hacer un Merge de estos sub-vectores ya
ordenados. Cada uno de esos sub-vectores se ordenan aplicando la misma
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
devuelve (el sub-vector está ordenado).
Gráficamente:
Ordenar vector
Ordenar sub-vector Ordenar sub-vector
Dividir en 1 o varios sub-
problemas
Problema
Ordenar sub-vector
izquierdo
Ordenar sub-vector
derecho
sub-vector derecho
sub-vector izquierdo
Resolver los sub-
problemas
sub-vector derecho
ordenado
sub-vector izquierdo
ordenado
Merge de los 2 sub-
Combinar las soluciones
de los sub-problemas
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Merge de los 2 sub-
vectores ordenados
Problema resuelto
de los sub-problemas
23. Repaso de Recursión
Ejemplo 2: Estrategia
Ordenar un arreglo con n elementos
mergesort(a, 0, 6)
Ordenar la 1er mitad del arreglo
n/2 elementos
Ordenar la 2da mitad del arreglo
n/2 elementos
mergesort (a, 0, 3)
mergesort (a, 4, 6)
Mezclar ambas mitades ya ordenadas
En cada paso
intermedio se
aplica la misma
estrategia
merge (a, 0, 3,6)
estrategia
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
24. Repaso de Recursión
Ejemplo 2:
public static void mergesort (int a[],int izq, int der) {
Ejemplo 2:
(a) if ( izq<der ) {
(b) int m = (izq+der)/2;
(c) mergesort (a,izq, m);
(d) mergesort (a,m+1, der);
(d) mergesort (a,m+1, der);
(e) merge (a, izq, m, der);
}
}
}
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
25. Repaso de Recursión
Ejemplo 2 (cont.) :
public static void merge ( int a[], int izq, int m, int der) {
int i, j, k;
int [] b = new int [a.length]; //array auxiliar
int [] b = new int [a.length]; //array auxiliar
for ( i=izq; i<=der; i++ ) { //copia ambas mitades en el array auxiliar
b[i]=a[i]; }
i=izq; j=m+1; k=izq;
i=izq; j=m+1; k=izq;
while (i<=m && j<=der) { //copia el siguiente elemento más grande
if (b[i]<=b[j])
a[k++]=b[i++];
a[k++]=b[i++];
else
a[k++]=b[j++];
}
}
while (i<=m) //copia los elementos que quedan de la
a[k++]=b[i++]; //primera mitad (si los hay)
}
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
}
27. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
Ejemplo 2: Ejecución
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
28. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 4, 5)
mergesort(a, 6, 6)
mergesort(a, 0, 3)
……..
……..
……..
merge(a, 4, 4, 5)
merge(a, 6, 6, 6)
……..
merge(a, 6, 6, 6)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
29. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 4, 5)
mergesort(a, 6, 6)
mergesort(a, 0, 3)
mergesort(a, 0, 1)
……..
……..
……..
merge(a, 4, 4, 5)
merge(a, 6, 6, 6)
……..
merge(a, 6, 6, 6)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
30. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 4, 5)
mergesort(a, 6, 6)
mergesort(a, 0, 3)
mergesort(a, 0, 1)
mergesort(a, 0, 0) ……..
……..
……..
merge(a, 4, 4, 5)
merge(a, 6, 6, 6)
……..
merge(a, 6, 6, 6)
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
37. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 0, 3)
mergesort(a, 4, 5)
mergesort(a, 6, 6)
mergesort(a, 2, 3)
mergesort(a, 0, 1)
……..
……..
……..
mergesort(a, 2, 2)
mergesort(a, 3, 3)
0 8
merge(a, 4, 4, 5)
merge(a, 6, 6, 6)
……..
mergesort(a, 3, 3)
merge(a, 2, 2, 3)
merge(a, 6, 6, 6)
Fin de la llamada recursiva
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
38. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 0, 3)
mergesort(a, 4, 5)
mergesort(a, 6, 6)
mergesort(a, 2, 3)
mergesort(a, 0, 1)
……..
……..
……..
0 8 -1 3
merge(a, 0, 1, 3)
merge(a, 4, 4, 5)
merge(a, 6, 6, 6)
……..
merge(a, 0, 1, 3)
merge(a, 6, 6, 6)
Fin de la llamada recursiva
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
39. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 4, 6)
mergesort(a, 0, 3) mergesort(a, 4, 6)
mergesort(a, 4, 5)
mergesort(a, 4, 5)
mergesort(a, 4, 5)
mergesort(a, 4, 4)
mergesort(a, 5, 5)
merge(a, 4, 4, 5)
Fin de la llamada recursiva
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
40. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 4, 6)
mergesort(a, 0, 3) mergesort(a, 4, 6)
mergesort(a, 6, 6)
mergesort(a, 4, 5)
mergesort(a, 4, 5)
mergesort(a, 6, 6)
mergesort(a, 4, 5)
merge(a, 4, 5, 6)
Fin de la llamada recursiva
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
41. Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)
mergesort(a, 0, 3)
Ejemplo 2: Ejecución
mergesort(a, 4, 6)
mergesort(a, 0, 3) mergesort(a, 4, 6)
merge(a, 0, 3, 6)
Fin de la llamada recursiva
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Fin de la llamada recursiva
42. Algoritmos y Estructuras de Datos
Cursada 2021
Cursada 2021
Prof. Alejandra Schiavoni (ales@info.unlp.edu.ar)
Prof. Catalina Mostaccio (catty@lifia.info.unlp.edu.ar)
Prof. Catalina Mostaccio (catty@lifia.info.unlp.edu.ar)
Prof. Laura Fava (lfava@info.unlp.edu.ar)
Prof. Laura Fava (lfava@info.unlp.edu.ar)
Prof. Pablo Iuliano (piuliano@info.unlp.edu.ar)
43. Agenda
Temas de la materia
Temas de la materia
Objetivos de la materia
Objetivos de la materia
Introducción al Análisis de Algoritmos
Introducción al Análisis de Algoritmos
Repaso de Recursión
Repaso de Recursión
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
44. Temas del curso
Temas del curso
Árboles
Árboles
Análisis de Algoritmos
Análisis de Algoritmos
Cola de Prioridades
Cola de Prioridades
Grafos
Grafos
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
45. Objetivos de la materia
Objetivos de la materia
Analizar algoritmos y evaluar su
eficiencia
eficiencia
Estudiar estructuras de datos
avanzadas: su implementación y
avanzadas: su implementación y
aplicaciones
aplicaciones
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
46. Estructuras de Datos
Estructuras de Datos
Una estructura de datos es una forma de almacenar y
organizar los datos con el fin de facilitar el acceso y las
organizar los datos con el fin de facilitar el acceso y las
modificaciones.
Ejemplo:
Ejemplo:
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Modelando la realidad con EEDD
Modelando la realidad con EEDD
47. Estructuras de Datos
Estructuras de Datos
Una estructura de datos es una forma de almacenar y
organizar los datos con el fin de facilitar el acceso y las
organizar los datos con el fin de facilitar el acceso y las
modificaciones.
Ejemplo:
Ejemplo:
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Modelando la realidad con EEDD
Modelando la realidad con EEDD
48. Estructuras de Datos
Estructuras de Datos
Una estructura de datos es una forma de almacenar y
organizar los datos con el fin de facilitar el acceso y las
organizar los datos con el fin de facilitar el acceso y las
modificaciones.
Ejemplo:
Ejemplo:
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Modelando la realidad con EEDD
Modelando la realidad con EEDD
49. Estructuras de Datos
Estructuras de Datos
Una estructura de datos es una forma de almacenar y
organizar los datos con el fin de facilitar el acceso y las
organizar los datos con el fin de facilitar el acceso y las
modificaciones.
Ejemplo:
Ejemplo:
Datos sin organización
Datos sin organización
Datos: libros
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Modelando la realidad con EEDD
Modelando la realidad con EEDD
50. Estructuras de Datos
Estructuras de Datos
Una estructura de datos es una forma de almacenar y
organizar los datos con el fin de facilitar el acceso y las
organizar los datos con el fin de facilitar el acceso y las
modificaciones.
Ejemplo:
Ejemplo:
Datos sin organización Datos organizados en una estructura
Datos sin organización
Datos: libros
Datos organizados en una estructura
Estructura de datos: biblioteca
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Modelando la realidad con EEDD
Modelando la realidad con EEDD
51. ¿De qué se trata el curso?
¿De qué se trata el curso?
Estudiar formas inteligentes de organizar la información, de
Estudiar formas inteligentes de organizar la información, de
forma tal de obtener algoritmos eficientes.
.
Listas, Pilas, Colas Insertar
Árboles Binarios
Árboles Generales
Borrar
Buscar
Árboles Generales
Heaps
Buscar
Caminos mínimos
Heaps
Grafos
Caminos mínimos
Ordenación
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Estructuras de Datos Algoritmos
52. Las estructuras de datos y sus
Las estructuras de datos y sus
algoritmos son….
Seguridad
Multimedia
Computación
Gráfica
Internet
Biología Inteligencia Artificial
Gráfica
Internet Física
Utilizados en todos lados!
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
53. Ejemplo 1: Árbol de carpetas y archivos
Ejemplo 1: Árbol de carpetas y archivos
Nodos: Carpetas/Archivos
Aristas: representan la relación “contiene”
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Aristas: representan la relación “contiene”
54. Ejemplo 2: Prerrequisitos de un curso
Ejemplo 2: Prerrequisitos de un curso
Nodos: Cursos
Aristas: relación de “prerrequisito”
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Aristas: relación de “prerrequisito”
55. Ejemplo 3: Representación de una expresión
Ejemplo 3: Representación de una expresión
en un compilador
Nodos: Operandos/Operadores
Aristas: representan las relaciones entre las operaciones
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Aristas: representan las relaciones entre las operaciones
56. Ejemplo 4: Esquema de una red informática
Ejemplo 4: Esquema de una red informática
Nodos: Equipos
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Nodos: Equipos
Aristas: representan las conexiones
57. Ejemplo 5: Mapa de ciudades
Ejemplo 5: Mapa de ciudades
Nodos: Ciudades
Aristas: Rutas
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Aristas: Rutas
58. Estructuras de Datos:
Estructuras de Datos:
Qué, Cómo y Por qué?
Los programas reciben, procesan y devuelven
Los programas reciben, procesan y devuelven
datos
Necesidad de organizar los datos de acuerdo
Necesidad de organizar los datos de acuerdo
al problema que vamos a resolver
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
59. Estructuras de Datos:
Estructuras de Datos:
Qué, Cómo y Por qué?
Los programas reciben, procesan y devuelven
Los programas reciben, procesan y devuelven
datos
Necesidad de organizar los datos de acuerdo
Necesidad de organizar los datos de acuerdo
al problema que vamos a resolver
Las estructuras de datos son formas de
organización de los datos
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
organización de los datos
60. Estructuras de Datos:
Estructuras de Datos:
Qué, Cómo y Por qué?
Un programa depende fundamentalmente de
la organización de los datos
cómo se organizan los datos está relacionado con:
cómo se organizan los datos está relacionado con:
Implementación de algunas operaciones: pueden
Implementación de algunas operaciones: pueden
resultar más fácil o más difícil
La velocidad del programa: puede aumentar o
La velocidad del programa: puede aumentar o
disminuir
La memoria usada: puede aumentar o disminuir
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
La memoria usada: puede aumentar o disminuir
61. Objetivos del curso respecto de las
Objetivos del curso respecto de las
Estructuras de Datos
Aprender a implementar las estructuras de datos
Aprender a implementar las estructuras de datos
usando abstracción
Estudiar diferentes representaciones e
implementaciones para las estructuras de datos
implementaciones para las estructuras de datos
Aprender a elegir la “mejor” estructura de datos
Aprender a elegir la “mejor” estructura de datos
para cada problema
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
62. Algoritmos y su Análisis
Algoritmos y su Análisis
¿Qué es un algoritmo?
¿Qué es un algoritmo?
Es una secuencia de pasos que resuelven un problema
Es independiente del lenguaje de programación
Es independiente del lenguaje de programación
Existen varios algoritmos que resuelven correctamente
un problema
La elección de un algoritmo particular tiene un enorme
La elección de un algoritmo particular tiene un enorme
impacto en el tiempo y la memoria que utiliza
La elección de un algoritmo y de la estructura de datos
para resolver un problema son interdependientes
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
para resolver un problema son interdependientes
63. Objetivos del curso respecto del
Objetivos del curso respecto del
Análisis de los Algoritmos
Entender los fundamentos matemáticos necesarios
para analizar algoritmos
para analizar algoritmos
Aprender a comparar la eficiencia de diferentes
Aprender a comparar la eficiencia de diferentes
algoritmos en términos del tiempo de ejecución
Estudiar algunos algoritmos estándares para el
manejo de las estructuras de datos y aprender a
manejo de las estructuras de datos y aprender a
usarlos para resolver nuevos problemas
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
64. Problemas y algoritmos
Problemas y algoritmos
Problemas:
Buscar un elemento en un arreglo
Buscar un elemento en un arreglo
Ordenar una lista de elementos
Encontrar el camino mínimo entre dos puntos
Encontrar el algoritmo que lo resuelve
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Encontrar el algoritmo que lo resuelve
65. Caso: Buscar un elemento en un
Caso: Buscar un elemento en un
arreglo
El arreglo puede estar:
• desordenado
• ordenado
Si el arreglo está desordenado
Si el arreglo está desordenado
64 13 93 97 33 6 43 14 51 84 25 53 95
64 13 93 97 33 6 43 14 51 84 25 53 95
0 1 2 3 4 5 6 7 8 9 10 11 12
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
66. Caso: Buscar un elemento en un
Caso: Buscar un elemento en un
arreglo
El arreglo puede estar:
• desordenado
• ordenado
Si el arreglo está desordenado Búsqueda secuencial
Si el arreglo está desordenado Búsqueda secuencial
64 13 93 97 33 6 43 14 51 84 25 53 95
64 13 93 97 33 6 43 14 51 84 25 53 95
0 1 2 3 4 5 6 7 8 9 10 11 12
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
67. Algoritmo: Búsqueda secuencial
Algoritmo: Búsqueda secuencial
public static int seqSearch(int[] a, int
key)
key)
{
int index = -1;
for (int i = 0; i < N; i++)
for (int i = 0; i < N; i++)
if (key == a[i])
index = i;
return index;
return index;
}
¿Cuántas comparaciones hace?
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
¿Cuántas comparaciones hace?
68. Caso: Buscar un elemento en un
Caso: Buscar un elemento en un
arreglo
El arreglo puede estar:
• desordenado
• desordenado
• ordenado
Si el arreglo está ordenado
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
69. Caso: Buscar un elemento en un
Caso: Buscar un elemento en un
arreglo
El arreglo puede estar:
• desordenado
• desordenado
• ordenado
Búsqueda binaria: Comparo la clave con
Si el arreglo está ordenado
Búsqueda binaria: Comparo la clave con
la entrada del centro
• Si es menor, voy hacia la izquierda
• Si es mayor, voy hacia la derecha
• Si es mayor, voy hacia la derecha
• Si es igual, la encontré
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
lo mid hi
70. Algoritmo: Búsqueda binaria
Algoritmo: Búsqueda binaria
Adivinar número - Búsqueda lineal o binaria
Adivinar número - Búsqueda lineal o binaria
https://es.khanacademy.org/computing/computer-
https://es.khanacademy.org/computing/computer-
science/algorithms/intro-to-algorithms/a/a-guessing-game
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
71. Algoritmo: Búsqueda binaria
Algoritmo: Búsqueda binaria
public static int binarySearch(int[] a, int key)
{
int lo = 0, hi = a.length-1;
int lo = 0, hi = a.length-1;
while (lo <= hi)
{
int mid = lo + (hi - lo) / 2;
int mid = lo + (hi - lo) / 2;
if (key < a[mid]) hi = mid - 1;
else if (key > a[mid]) lo = mid + 1;
else return mid;
else return mid;
}
return -1;
}
}
¿Cuántas comparaciones hace?
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
¿Cuántas comparaciones hace?
72. ¿Cuántas operaciones hace
¿Cuántas operaciones hace
cada algoritmo?
N Cantidad de
operaciones
N Cantidad de
operaciones
operaciones
1000 1000
2000 2000
operaciones
1000 ~10
2000 ~11
Búsqueda Búsqueda
2000 2000
4000 4000
2000 ~11
4000 ~12
Búsqueda
secuencial
Búsqueda
binaria
8000 8000
16000 16000
8000 ~13
16000 ~14
16000 16000 16000 ~14
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
73. ¿Cuántas operaciones hace
¿Cuántas operaciones hace
cada algoritmo?
N Cantidad de
operaciones
N Cantidad de
operaciones
operaciones
1000 1000
2000 2000
operaciones
1000 ~10
2000 ~11
Búsqueda Búsqueda
2000 2000
4000 4000
2000 ~11
4000 ~12
Búsqueda
secuencial
Búsqueda
binaria
8000 8000
16000 16000
8000 ~13
16000 ~14
16000 16000 16000 ~14
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Hace N operaciones Hace log(N) operaciones
74. ¿Cómo medir el tiempo?
¿Cómo medir el tiempo?
En forma empírica
Se realiza a posteriori
En forma teórica
Se realiza a priori
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
75. Análisis empírico
Análisis empírico
Correr el programa para varios tamaños de la entrada y medir el
Correr el programa para varios tamaños de la entrada y medir el
tiempo. Suponemos que cada comparación tarda 1 seg.
N Tiempo (seg)
1000 1000
N Tiempo (seg)
1000 ~10
1000 1000
2000 2000
1000 ~10
2000 ~11
Búsqueda Búsqueda
4000 4000 ~ 1 hs. 4000 ~12
Búsqueda
secuencial
Búsqueda
binaria
8000 8000 ~ 2 hs
16000 16000 ~ 4 hs.
8000 ~13
16000 ~14
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
76. Análisis de Algoritmos
Análisis de Algoritmos
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
77. Cantidad de operaciones de la
Cantidad de operaciones de la
búsqueda binaria
búsqueda binaria
Ejercitación
https://es.khanacademy.org/computing/computer-
science/algorithms/binary-search/e/running-time-of-binary-
science/algorithms/binary-search/e/running-time-of-binary-
search
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
78. Caso: Buscar un elemento en una
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
La lista puede estar:
• desordenada
• ordenada
• ordenada
¿Cómo sería el algoritmo de búsqueda?
¿Cómo sería el algoritmo de búsqueda?
6
primero
10 2 50
6 10 2 50
null
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
79. Caso: Buscar un elemento en una
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
La lista puede estar:
• desordenada
• ordenada
• ordenada
¿Cómo sería el algoritmo de búsqueda?
¿Cómo sería el algoritmo de búsqueda?
6
primero
10 2 50
6 10 2 50
null
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
80. Caso: Buscar un elemento en una
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
La lista puede estar:
• desordenada
• ordenada
• ordenada
¿Cómo sería el algoritmo de búsqueda? ¿Cuántas
¿Cómo sería el algoritmo de búsqueda?
6
primero
10 2
¿Cuántas
comparaciones
hace?
50
6 10 2
hace?
50
null
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
81. Caso: Buscar un elemento en una
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
La lista puede estar:
• desordenada
• ordenada
• ordenada
¿Cómo sería el algoritmo de búsqueda? ¿Cuántas
¿Cómo sería el algoritmo de búsqueda?
6
primero
10 2
¿Cuántas
comparaciones
hace?
50
6 10 2
hace?
50
null
Hace N comparaciones
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
Hace N comparaciones
82. Análisis de Algoritmos
Análisis de Algoritmos
Marco para predecir la performance y
comparar algoritmos
Desafío:
Escribir programas que puedan resolver en forma
eficiente problemas con una gran entrada de datos
eficiente problemas con una gran entrada de datos
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
83. Análisis de Algoritmos
Análisis de Algoritmos
Factores
independientes
Factores
dependientes del
Algoritmo
independientes
del sistema Hardware:
CPU, memoria
dependientes del
sistema
Entrada de
datos
Software:
lenguaje,
datos
lenguaje,
compilador, ..
Sistema: SO,
red, otras
aplicaciones
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
aplicaciones
84. Análisis de Algoritmos
Análisis de Algoritmos
Factores
independientes
Factores
dependientes del
Algoritmo
independientes
del sistema Hardware:
CPU, memoria
dependientes del
sistema
Entrada de
datos
Software:
lenguaje,
cantidad y
datos
lenguaje,
compilador, ..
cantidad y
distribución
Sistema: SO,
red, otras
aplicaciones
Cómo se comporta el
Algoritmo dependiendo
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
aplicaciones
Algoritmo dependiendo
de la entrada de datos.
85. Análisis de Algoritmos
Análisis de Algoritmos
Existe un modelo matemático para medir el tiempo
Tiempo total:
Suma del costo x frecuencia de todas las
Suma del costo x frecuencia de todas las
operaciones
• Es necesario analizar el algoritmo para determinar el conjunto de
operaciones
operaciones
• Costo depende de la máquina, del compilador, del lenguaje
• Frecuencia depende del algoritmo y de la entrada
Algoritmos y Estructuras de Datos 2021
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio
• Frecuencia depende del algoritmo y de la entrada
86. Algoritmos y Estructuras de Datos 2021
Constructores
• Inicialización de Objetos – Constructores
- ¿Qué son los Constructores?
- Constructor default.
- Constructores con argumentos
- Sobrecarga de constructores
- Cadena de invocación a constructores
• Usos y diferencias entre:
- this y this()
- super y super()
87. Algoritmos y Estructuras de Datos 2021
Constructores
Para crear un objeto se utiliza el operador new. La creación e inicialización de un
objeto involucra los siguientes pasos:
1. Se aloca espacio para la variable
2. Se aloca espacio para el objeto en la HEAP y se inicializan los atributos con valores por defecto.
3. Se inicializan explícitamente los atributos del objeto.
4. Se ejecuta el constructor (parecido a un método y tiene el mismo nombre de la clase)
5. Se asigna la referencia del nuevo objeto a la variable.
null
Memoria STACK
0x99f311
Memoria STACK Memoria HEAP
auto
public class Vehiculo {
private String marca;
private double precio;
. . .
}
Objeto
Vehiculo
public class Test {
public static void main(String args[]){
Vehiculo auto;
auto = new Vehiculo();
}
}
auto
a
g
r
e
g
a
r
C
o
n
t
a
c
t
o
. .
.
gerMarca()
g
e
t
P
r
e
c
i
o
(
)
marca=null
precio=0.0
...
88. Algoritmos y Estructuras de Datos 2021
public class Vehiculo {
private String marca;
private double precio;
public Vehiculo() {
}
}
¿Qué son los Constructores?
Los constructores son piezas de código -sintácticamente similares a los métodos- que
permiten definir un estado inicial específico de un objeto en el momento de su creación.
Se diferencian de los métodos tradicionales porque:
• Deben tener el mismo nombre que la clase. La regla de que el nombre de los métodos
debe comenzar con minúscula, no se aplica a los constructores.
• No retornan un valor.
• Son invocados automáticamente.
La inicialización está garantizada: cuando un objeto es creado, se aloca almacenamiento en la
memoria HEAP y se invoca al constructor.
Vehiculo v = new Vehiculo(); El operador new() se puede utilizar en
cualquier lugar del código.
NO retorna nada
- La expresión new retorna una referencia al objeto creado recientemente, pero el constructor no retorna un
valor.
- Java siempre llama automáticamente a un constructor cuando crea un objeto (antes de que el objeto sea
usado). De esta forma la inicialización del objeto está garantizada.
89. Algoritmos y Estructuras de Datos 2021
public class Vehiculo {
private String marca;
private double precio;
//métodos
}
Constructor sin argumentos
• Si una clase NO tiene constructores, el compilador inserta automáticamente un
constructor default, con cuerpo vacío:
Cuando se compila
public Vehiculo(){
}
Cuando se crea un objeto de la clase Vehiculo, con new Vehiculo(), se invocará el
constructor por defecto, aún cuando no se encuentre explícitamente en la clase.
• Si la clase tiene al menos un constructor, con o sin argumentos, el compilador NO
insertará nada.
Un constructor sin argumento o constructor Default, es usado para crear un objeto básico.
90. Algoritmos y Estructuras de Datos 2021
Constructores con argumentos
En general los constructores son usados para inicializar los valores del objeto que se está
creando. ¿Cómo especificar los valores para la inicialización? Los constructores pueden tener
parámetros para la inicialización de un objeto.
Si este constructor es el único de la clase, el compilador no permitirá crear un objeto Vehiculo
de otra manera que no sea usando este constructor .
public class Automotores {
public static void main(String[] args){
Vehiculo auto1 = new Vehiculo(“CITROEN”, 13500.00);
Vehiculo auto2 = new Vehiculo(“HONDA”,12400.50);
}
}
public class Vehiculo {
private String marca;
private double precio;
public Vehiculo(String mar,double pre){
marca = mar;
precio = pre;
}
}
public Vehiculo(String marca,double precio) {
this.marca = marca;
this.precio = precio;
}
Codificaciones
equivalentes
91. Algoritmos y Estructuras de Datos 2021
¿Qué pasa si se quiere construir un objeto Vehiculo de distintas maneras?
Se escriben en la clase más de un constructor sobrecarga de constructores.
Sobrecarga de Constructores
public class Vehiculo {
private String nroPatente=“”;
private String propietario=“SinDueño”;
public Vehiculo(){
}
public Vehiculo(String marca){
this.marca = marca;
}
public Vehiculo(String marca,double precio){
this.marca = marca;
this.precio = precio;
}
}
public class Botanico {
public static void main(String[] args){
Vehiculo a1=new Vehiculo();
Vehiculo a2=new Vehiculo(“HONDA”);
Vehiculo a3=new Vehiculo(“HONDA”,12300.50);
}
}
La sobrecarga de métodos
permite que el mismo nombre de
método sea usado con distintos
tipos y cantidad de argumentos.
92. Algoritmos y Estructuras de Datos 2021
this() y this
Cuando dentro de una clase, hay más de
un constructor, se pueden invocar entre
ellos para evitar duplicar código.
Para hacer esto se puede usar this(), el
cual hace una invocación a otro constructor
de la misma clase que coincida con la lista
de argumentos.
this()
public class Vehiculo {
private String marca;
private double precio;
public Vehiculo(String marca){
// podría tener más código
this.marca = marca;
}
public Vehiculo(String marca,double precio){
this(marca);
this.precio = precio;
}
Si tenemos 2 objetos de la clase Vehiculo, llamados a1 y a2 e invocamos al método setNroPatente()
sobre ambos objetos, ¿cómo sabe el método para que objetos se llama?
Vehiculo a1 = new Vehiculo();
Vehiculo a2 = new Vehiculo();
. . .
a1.setMarca(“CITROEN”);
a2.setMarca(“HONDA”);
El compilador agrega como 1º argumento de cada método
una referencia al objeto que está siendo manipulado.
this
// debe estar en la 1º línea
public class Vehiculo {
private String marca;
private String precio;
. . .
public setMarca(String marca){
this.marca = marca;
}
}
94. Algoritmos y Estructuras de Datos 2021
¿Cómo se construye un objeto?
Recorriendo la jerarquía de herencia en forma ascendente e invocando al
constructor de la superclase desde cada constructor, en cada nivel de la
jerarquía de clases:
Cadena de invocación a constructores
crear un objeto de tipo Object
crear un objeto de tipo Vertebrado
crear un objeto de tipo Mamifero
crear un objeto de tipo Perro
La clase Object
La clase Vertebrado
La clase Mamifero
La clase Perro
new Perro()
Constructor de
Mamífero()
En cada constructor de una clase derivada, debe existir una llamada a un
constructor de la superclase.
Constructor de
Vertebrado()
Constructor de
Object()
Estoy listo!
95. Algoritmos y Estructuras de Datos 2021
public class Perro extends Mamifero{
. .
public Perro(){
super(); // si no se pone, igual se invoca
System.out.println(“Constructor de Perro”);
}
public void comer(){ }
}
public class Mamifero extends Vertebrado {
public Mamifero(){
super(); // si no se pone, igual se invoca
System.out.println(“Constructor de Mamifero”);
}
public void comer(){
}
}
El compilador Java, automáticamente invoca en cada constructor de una
clase derivada, al constructor nulo de su clase base, si no se invocó
ninguno explícitamente.
La clase Object
La clase Vertebrado
La clase Mamifero
La clase Perro
super()
super()
super()
new Perro()
public class Vertebrado {
public Vertebrado (){
super(); // si no se pone, igual se invoca
System.out.println(“Constructor de Vertebrado”);
}
}
¿Cuál sería la salida de la
ejecución de
new Perro()?
Cadena de invocación a constructores
96. Algoritmos y Estructuras de Datos 2021
public class Perro extends Mamifero{
. .
public Perro(){
System.out.println(“Constructor de Perro”);
}
public void comer(){ }
}
super()
public class Mamifero extends Vertebrado {
public Mamifero(){
System.out.println(“Constructor de Mamifero”);
}
public void comer(){
}
}
super()
Error!!
¿Qué pasa si Vertebrado tiene un constructor con argumentos y no tiene el
constructor sin argumentos (default)?
La clase Object
La clase Vertebrado
La clase Mamifero
La clase Perro
new Perro()
public class Vertebrado {
private int cantpatas;
public Vertebrado (int i){
cantpatas = c;
System.out.println(“Constructor de Vertebrado”);
}
}
super()
Desde el constructor de Mamifero se debe invocar a alguno de los constructores existentes en la
superclase Vertebrado usando la palabra clave super(…) y la lista de argumentos apropiada.
¿Cómo hacemos?
super()
super()
super()
Cadena de invocación a constructores
97. Algoritmos y Estructuras de Datos 2021
public class Vertebrado {
private int cantpatas;
public Vertebrado(int c){
cantpatas = c;
System.out.println(“Constructor de Vertebrado”);
}
public void comer(){}
}
public class Perro extends Mamifero{
. .
public Perro(){
System.out.println(“Constructor de Perro”);
}
public void comer(){ }
}
super()
public class Mamifero extends Vertebrado {
public Mamifero(){
super(4);
System.out.println(“Constructor de Mamifero”);
}
public void comer(){}
}
super()
Si un constructor no invoca a ningún constructor de la clase base, el compilador inserta la invocación al
constructor nulo (super()).
Si un constructor invoca explícitamente a un constructor de la superclase, debe hacerlo en la primera
línea de dicho constructor.
La clase Object
La clase Vertebrado
La clase Mamifero
La clase Perro
super(4)
super()
super()
Perro p = new Perro()
¿Qué pasa si Vertebrado tiene un constructor con argumentos y no tiene el
constructor sin argumentos (default)? continuación
Cadena de invocación a constructores
98. Algoritmos y Estructuras de Datos 2021
super() y super
Super() invoca a un constructor de la superclase
y debe estar en la primer línea de código del
constructor.
JAVA garantiza la correcta creación de los
objetos ya que los constructores siempre
invocan a los constructores de la superclase. De
esta manera todo objeto contiene una referencia
al objeto de la superclase habilitando la
herencia de estado y comportamiento.
super()
Todos los métodos de instancia disponen de la variable super (además de this), la cual contiene
una referencia al objeto padre. La palabra clave super, permite invocar desde la subclase un
método de la superclase.
super
public class Perro extends Mamifero {
private String sonido;
public Perro(){
super(4);
sonido=new String(“guau”);
}
. . .
}
se invoca al constructor de
Mamifero con
argumento de tipo entero.
En este ejemplo, el código del constructor
Perro() espera hasta que el padre se inicialice
para continuar con su código.
102. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Recorridos
Preorden
Se procesa primero la raíz y luego sus hijos, izquierdo y derecho.
40, 25, 10, 32, 78
Inorden
Se procesa el hijo izquierdo, luego la raíz y último el hijo derecho
10, 25, 32, 40, 78
Postorden
Se procesan primero los hijos, izquierdo y derecho, y luego la raíz
10, 32, 25, 78, 40
Por niveles
Se procesan los nodos teniendo en cuenta sus niveles, primero la raíz, luego los
hijos, los hijos de éstos, etc.
40, 25, 78, 10, 32
103. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Arboles Binarios
Recorrido PreOrden
Se procesa primero la raíz y luego sus hijos, izquierdo y derecho
104. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Arboles Binarios
Recorrido PreOrden
Qué cambio harias si el método preorden() debe definirse en otra clase diferente al ArbolBinario<T>?
105. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Arboles Binarios
Recorrido PreOrden
Qué cambio harías para devolver una lista con los elementos de un recorrido en preorden?
106. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Recorrido por Niveles
Recorrido implementado en la clase ArbolBinario
107. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Es árbol lleno?
public boolean lleno() {
ArbolBinario<T> arbol = null;
ColaGenerica<ArbolBinario<T>> cola = new ColaGenerica<ArbolBinario<T>>();
boolean lleno = true;
cola.encolar( this);
int cant_nodos=0;
cola.encolar( null);
int nivel= 0;
while (!cola.esVacia() && lleno) {
arbol = cola.desencolar();
if (arbol != null) {
System. out.print(arbol.getDatoRaiz());
if (!arbol.getHijoIzquierdo().esvacio()) {
cola.encolar(arbol.getHijoIzquierdo());
cant_nodos++;
}
if (!(arbol.getHijoDerecho().esvacio()) {
cola.encolar(arbol.getHijoDerecho());
cant_nodos++;
}
} else if (!cola.esVacia()) {
if (cant_nodos == Math.pow(2, ++nivel)){
cola.encolar( null);
cant_nodos=0;
System. out.println();
}
else lleno=false;}
}
return lleno;
}
Dado un árbol binario de altura h, diremos que es lleno si cada nodo interno tiene grado 2 y todas las
hojas están en el mismo nivel (h). Implementar un método para determinar si un árbol binario es “lleno”
arbol = null
cant_nodos = 2
1 null 2 5
cola
Nivel/Prof
0
1
2
arbol = cola.desencolar();
108. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Árbol de Expresión
/
* +
+
b
a
c d e
Un árbol de expresión es un árbol binario asociado a una expresión aritmética
donde:
• Nodos internos representan operadores
• Nodos externos (hojas) representan operandos
109. Algoritmos y Estructuras de Datos 2021
public ArbolBinario<Character> convertirPostfija(String exp) {
char c = null;
ArbolBinario<Character> result;
PilaGenerica<ArbolBinario<Character>> p = new PilaGenerica<ArbolBinario<Character>>();
for (int i = 0; i < exp.length(); i++) {
c = exp.charAt(i);
result = new ArbolBinario<Character>(c);
if ((c == '+') || (c == '-') || (c == '/') || (c == '*')) {
// Es operador
result.agregarHijoDerecho(p.desapilar());
result.agregarHijoIzquierdo(p.desapilar ());
}
p.apilar(result);
}
return (p.desapilar());
}
Arboles Binarios
Convertir expresión posfija en árbol de Expresión
ab+c*de+/
/
* +
+
b
a
c d e
Este método convierte una expresión postfija en un ArbolBinario. Puede estar
implementado en cualquier clase.
110. Algoritmos y Estructuras de Datos 2021
public ArbolBinario<Character> convertirPrefija(StringBuffer exp) {
char c = exp.charAt(0);
ArbolBinario<Character> result = new ArbolBinario<Character>(c);
if ((c == '+') || (c == '-') || (c == '/') || c == '*') {
// es operador
result.agregarHijoIzquierdo(this.convertirPrefija(exp.delete(0,1)));
result.agregarHijoDerecho(this.convertirPrefija(exp.delete(0,1)));
}
// es operando
return result;
}
Este método convierte una expresión prefija en un ArbolBinario. Puede estar
implementado en cuaquier clase.
Arboles Binarios
Convertir expresión prefija en árbol de expresión
/*+abc+de
/
* +
+
b
a
c d e
111. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Evaluación de un Árbol de Expresión
public Integer evaluar(ArbolBinario<Character> arbol) {
Character c = arbol.getDato();
// es operador
if ((c == '+') || (c == '-') || (c == '/') || c == '*') {
int operador_1 = evaluar(arbol.getHijoIzquierdo());
int operador_2 = evaluar(arbol.getHijoDerecho());
switch (c) {
case '+':
return operador_1 + operador_2;
case '-':
return operador_1 - operador_2;
case '*':
return operador_1 * operador_2;
case '/':
return operador_1 / operador_2;
}
}
// es operando
return Integer.parseInt(c.toString());
}
Este método evalúa y retorna un número de acuerdo a la expresión aritmética representada por
el ArbolBinario que es enviado como parámetro.
/
* +
+
2
1
9 2 1
retorna 9
112. Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Árbol de Frecuencia Natural
Investigadores de la Universidad de Regensburg, junto con investigadores del área de medicina del
Hospital LMU de Munich, han descubierto que los diagnósticos médicos se pueden realizar con
mayor precisión y rapidez con la ayuda de árboles de frecuencias naturales (*).
Un árbol de frecuencia natural (AFN) es un árbol binario asociado con ocurrencias, donde para todos
los nodos que no son hojas, su valor es la suma del valor de sus dos hijos.
La imagen muestra un AFN construido a
partir 10.000 mamografía efectuadas a
distintas pacientes
(*) https://medicalxpress.com/news/2021-02-faster-accurate-diagnosis-natural-frequency.html
113. Algoritmos y Estructuras de Datos 2021
public class Frecuencia {
private String detalle;
private int valor;
public Frecuencia(String detalle, int valor) {
super();
this.detalle = detalle;
this.valor = valor;
}
public String getDetalle() {
return detalle;
}
public void setDetalle(String detalle) {
this.detalle = detalle;
}
public int getValor() {
return valor;
}
public void setValor(int valor) {
this.valor = valor;
}
public String toString() {
return this.getDetalle()+"("+this.getValor()+")";
}
}
Arboles Binarios
Árbol de Frecuencia Natural
Debemos codificar un método que dado un árbol binario verificar si se trata de un AFN o no.
114. Algoritmos y Estructuras de Datos 2021
public static boolean esAFN(ArbolBinario<Frecuencia> ab) {
if (!ab.esHoja()) {
int valor = 0;
if (ab.tieneHijoIzquierdo()) {
valor = (ab.getHijoIzquierdo().getDato().getValor());
}
if (ab.tieneHijoDerecho()) {
valor = valor + (ab.getHijoDerecho().getDato().getValor());
}
if (ab.getDato().getValor()==valor) {
if (ab.tieneHijoIzquierdo()) {
if (!esAFN(ab.getHijoIzquierdo())) return false;
}
if (ab.tieneHijoDerecho()) {
if (!esAFN(ab.getHijoDerecho())) return false;
}
} else
return false;
}
return true;
}
Arboles Binarios
Árbol de Frecuencia Natural - Solución recursiva
115. Algoritmos y Estructuras de Datos 2021
public static boolean esAFN1(ArbolBinario<Frecuencia> a) {
ArbolBinario<Frecuencia> arbol = null;
ColaGenerica<ArbolBinario<Frecuencia>> cola = new ColaGenerica<ArbolBinario<Frecuencia>>();
boolean sigue = true;
cola.encolar(a);
while (!cola.esVacia() && sigue) {
arbol = cola.desencolar();
int val_padre = 0;
int val_hijos = 0;
if (arbol != null) {
val_padre = arbol.getDato().getValor();
val_hijos = 0;
if (arbol.tieneHijoIzquierdo()) {
cola.encolar(arbol.getHijoIzquierdo());
val_hijos = arbol.getHijoIzquierdo().getDato().getValor();
}
if (arbol.tieneHijoDerecho()) {
cola.encolar(arbol.getHijoDerecho());
val_hijos = val_hijos + arbol.getHijoDerecho().getDato().getValor();
}
if (!arbol.esHoja() && val_padre != val_hijos)
sigue = false;
}
}
return sigue;
}
Arboles Binarios
Árbol de Frecuencia Natural - Solución iterativa
116. Algoritmos y Estructuras de Datos 2021
public static void main(String[] args) {
ArbolBinario<Frecuencia> arbolRaizGral = new ArbolBinario<Frecuencia>(new Frecuencia("Mujeres", 10000));
ArbolBinario<Frecuencia> hijoIzquierdoB = new ArbolBinario<Frecuencia>(new Frecuencia("Con Cancer", 100));
hijoIzquierdoB.agregarHijoIzquierdo(new ArbolBinario<Frecuencia>(new Frecuencia("Mamo +", 80)));
hijoIzquierdoB.agregarHijoDerecho(new ArbolBinario<Frecuencia>(new Frecuencia("Mamo -", 20)));
arbolRaizGral.agregarHijoIzquierdo(hijoIzquierdoB);
ArbolBinario<Frecuencia> hijoDerechoB = new ArbolBinario<Frecuencia>(new Frecuencia("Sin Cancer", 9900));
hijoDerechoB.agregarHijoIzquierdo(new ArbolBinario<Frecuencia>(new Frecuencia("Mamo +", 950)));
hijoDerechoB.agregarHijoDerecho(new ArbolBinario<Frecuencia>(new Frecuencia("Mamo -", 8950)));
arbolRaizGral.agregarHijoDerecho(hijoDerechoB);
if (esAFN(arbolRaizGral))
System.out.println("Es AFN");
else
System.out.println("No es AFN");
}
Arboles Binarios
Árbol de Frecuencia Natural - Construcción