Está en la página 1de 116

Algoritmos y Estructuras de Datos

Cursada 2021

Prof. Alejandra Schiavoni (ales@info.unlp.edu.ar)

Prof. Catalina Mostaccio (catty@lifia.info.unlp.edu.ar)

Prof. Laura Fava (lfava@info.unlp.edu.ar)

Prof. Pablo Iuliano (piuliano@info.unlp.edu.ar)


Repaso de Recursión

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión

 Se dice que un objeto es recursivo cuando forma


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í
mismos para resolver un problema.

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
 Ejemplos de definiciones recursivas:
• Factorial de un número
0! = 1
Si n > 0, n! = n * (n-1)!

• Potencia de un número
x0 = 1
Si y > 0, xy = x * xy-1

• Estructuras de datos
Árboles

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión

 Ejemplos de soluciones recursivas:

• Buscar un elemento en un arreglo

• Ordenar un arreglo de elementos

• Recorrer un árbol

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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);
else
System.out.print(n mod 10); // el resto de la división entera
invertir (n div 10);
}

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
else
Entrada: 123 System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
}

Salida:
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
else
Entrada: 123 System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
}

invertir (123)
n = 123
print (3)
invertir (12)

Salida: 3
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
else
Entrada: 123 System.out.print(n mod 10); // el resto de la
división entera
invertir (n div 10);
}

invertir (12)
n = 12
print (2)
invertir (1)
invertir (123) invertir (123)
n = 123 n = 123
print (3) print (3)
invertir (12) invertir (12)

Salida: 3 2
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
invertir (1) else
Entrada: 123 n=1 System.out.print(n mod 10); // el resto de la
división entera
print (1) invertir (n div 10);
}

invertir (12) invertir (12)


n = 12 n = 12
print (2) print (2)
invertir (1) invertir (1)
invertir (123) invertir (123) invertir (123)
n = 123 n = 123 n = 123
print (3) print (3) print (3)
invertir (12) invertir (12) invertir (12)

Salida: 3 2 1
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
invertir (1) else
Entrada: 123 n=1 System.out.print(n mod 10); // el resto de la
división entera
print (1) invertir (n div 10);
}

invertir (12) invertir (12)


n = 12 n = 12
print (2) print (2)
invertir (1) invertir (1)
invertir (123) invertir (123) invertir (123)
n = 123 n = 123 n = 123
print (3) print (3) print (3)
invertir (12) invertir (12) invertir (12)

Salida: 3 2 1
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
invertir (1) else
Entrada: 123 n=1 System.out.print(n mod 10); // el resto de la
división entera
print (1) invertir (n div 10);
}

invertir (12) invertir (12) invertir (12)


n = 12 n = 12 n = 12
print (2) print (2) print (2)
invertir (1) invertir (1) invertir (1)
invertir (123) invertir (123) invertir (123) invertir (123)
n = 123 n = 123 n = 123 n = 123
print (3) print (3) print (3) print (3)
invertir (12) invertir (12) invertir (12) invertir (12)

Salida: 3 2 1
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
invertir (1) else
Entrada: 123 n=1 System.out.print(n mod 10); // el resto de la
división entera
print (1) invertir (n div 10);
}

invertir (12) invertir (12) invertir (12)


n = 12 n = 12 n = 12
print (2) print (2) print (2)
invertir (1) invertir (1) invertir (1)
invertir (123) invertir (123) invertir (123) invertir (123)
n = 123 n = 123 n = 123 n = 123
print (3) print (3) print (3) print (3)
invertir (12) invertir (12) invertir (12) invertir (12)

Salida: 3 2 1
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
invertir (1) else
Entrada: 123 n=1 System.out.print(n mod 10); // el resto de la
división entera
print (1) invertir (n div 10);
}

invertir (12) invertir (12) invertir (12)


n = 12 n = 12 n = 12
print (2) print (2) print (2)
invertir (1) invertir (1) invertir (1)
invertir (123) invertir (123) invertir (123) invertir (123) invertir (123)
n = 123 n = 123 n = 123 n = 123 n = 123
print (3) print (3) print (3) print (3) print (3)
invertir (12) invertir (12) invertir (12) invertir (12) invertir (12)

Salida: 3 2 1
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión int invertir (int n)
{
if (n < 10) //caso base
 Ejecución: System.out.print(n);
invertir (1) else
Entrada: 123 n=1 System.out.print(n mod 10); // el resto de la
división entera
print (1) invertir (n div 10);
}

invertir (12) invertir (12) invertir (12)


n = 12 n = 12 n = 12
print (2) print (2) print (2)
invertir (1) invertir (1) invertir (1)
invertir (123) invertir (123) invertir (123) invertir (123) invertir (123)
n = 123 n = 123 n = 123 n = 123 n = 123
print (3) print (3) print (3) print (3) print (3)
invertir (12) invertir (12) invertir (12) invertir (12) invertir (12)

Salida: 3 2 1
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
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 combinan los resultados de cada solución
 Se cuenta con un caso base.

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
Gráficamente:

Ordenar vector

Ordenar sub-vector Ordenar sub-vector


izquierdo derecho

sub-vector izquierdo sub-vector derecho


ordenado ordenado

Merge de los 2 sub-


vectores ordenados

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
Gráficamente:

Problema Ordenar vector


Dividir en 1 o varios sub-
problemas

Ordenar sub-vector Ordenar sub-vector


izquierdo derecho

sub-vector izquierdo sub-vector derecho


ordenado ordenado

Merge de los 2 sub-


vectores ordenados

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
Gráficamente:

Problema Ordenar vector


Dividir en 1 o varios sub-
problemas

Ordenar sub-vector Ordenar sub-vector


izquierdo derecho Resolver los sub-
problemas

sub-vector izquierdo sub-vector derecho


ordenado ordenado

Merge de los 2 sub-


vectores ordenados

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
Gráficamente:

Problema Ordenar vector


Dividir en 1 o varios sub-
problemas

Ordenar sub-vector Ordenar sub-vector


izquierdo derecho Resolver los sub-
problemas

sub-vector izquierdo sub-vector derecho


ordenado ordenado

Combinar las soluciones


Merge de los 2 sub- de los sub-problemas
vectores ordenados

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
estrategia, hasta tanto el vector contenga sólo un dato y en ese caso se lo
devuelve (el sub-vector está ordenado).
Gráficamente:

Problema Ordenar vector


Dividir en 1 o varios sub-
problemas

Ordenar sub-vector Ordenar sub-vector


izquierdo derecho Resolver los sub-
problemas

sub-vector izquierdo sub-vector derecho


ordenado ordenado

Combinar las soluciones


Merge de los 2 sub- de los sub-problemas
Problema resuelto vectores ordenados

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Estrategia
Ordenar un arreglo con n elementos
mergesort(a, 0, 6)

Ordenar la 1er mitad del arreglo Ordenar la 2da mitad del arreglo
n/2 elementos n/2 elementos
mergesort (a, 0, 3)
mergesort (a, 4, 6)

En cada paso
intermedio se
Mezclar ambas mitades ya ordenadas aplica la misma
estrategia

merge (a, 0, 3,6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2:

public static void mergesort (int a[],int izq, int der) {


(a) if ( izq<der ) {
(b) int m = (izq+der)/2;
(c) mergesort (a,izq, m);
(d) mergesort (a,m+1, der);
(e) merge (a, izq, m, der);
}
}

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
for ( i=izq; i<=der; i++ ) { //copia ambas mitades en el array auxiliar
b[i]=a[i]; }
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++];
else
a[k++]=b[j++];
}
while (i<=m) //copia los elementos que quedan de la
a[k++]=b[i++]; //primera mitad (si los hay)
}

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3) mergesort(a, 4, 6)

mergesort(a, 0, 1) mergesort(a, 4, 5)
mergesort(a, 2, 3) mergesort(a, 6, 6)

mergesort(a, 0, 0) ……..
…….. ……..
…….. ……..
……..

merge(a, 0, 0, 1) merge(a, 4, 4, 5)
merge(a, 2, 2, 3) merge(a, 6, 6, 6)

…….. ……..
…….. ……..
…….. ……..

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 4, 5)
mergesort(a, 6, 6)

……..
……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 4, 5)
mergesort(a, 6, 6)

……..
……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 4, 5)
mergesort(a, 6, 6)

mergesort(a, 0, 0) ……..
……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 4, 5)
mergesort(a, 6, 6)

mergesort(a, 0, 0) mergesort(a, 1, 1) ……..


……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 4, 5)
mergesort(a, 6, 6)

mergesort(a, 0, 0) mergesort(a, 1, 1) ……..


……..
merge(a, 0, 0, 1) ……..

merge(a, 4, 4, 5)
Fin de la llamada recursiva
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 4, 5)
mergesort(a, 6, 6)

0 8
……..
……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 2, 3) mergesort(a, 4, 5)


mergesort(a, 6, 6)

0 8
……..
……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 2, 3) mergesort(a, 4, 5)


mergesort(a, 6, 6)

0 8
mergesort(a, 2, 2) ……..
……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 2, 3) mergesort(a, 4, 5)


mergesort(a, 6, 6)

0 8
mergesort(a, 2, 2) ……..
……..
mergesort(a, 3,……..
3)

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 2, 3) mergesort(a, 4, 5)


mergesort(a, 6, 6)

0 8
mergesort(a, 2, 2) ……..
……..
mergesort(a, 3,……..
3)

merge(a,
merge(a, 2, 2, 3) 4, 4, 5)
merge(a, 6, 6, 6)
Fin de la llamada recursiva

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3)

mergesort(a, 0, 1) mergesort(a, 2, 3) mergesort(a, 4, 5)


mergesort(a, 6, 6)

0 8 -1 3
……..
……..
……..

merge(a, 4, 4, 5)
merge(a, 6, 6, 6)
merge(a, 0, 1, 3)

Fin de la llamada recursiva

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3) mergesort(a, 4, 6)

mergesort(a, 4, 5)
mergesort(a, 5, 5)
mergesort(a, 4, 5)
mergesort(a, 4, 4)

merge(a, 4, 4, 5)

Fin de la llamada recursiva

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3) mergesort(a, 4, 6)

mergesort(a, 4, 5) mergesort(a, 6, 6)

mergesort(a, 4, 5)

merge(a, 4, 5, 6)

Fin de la llamada recursiva

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Repaso de Recursión
Ejemplo 2: Ejecución
mergesort(a, 0, 6)

mergesort(a, 0, 3) mergesort(a, 4, 6)

merge(a, 0, 3, 6)

Fin de la llamada recursiva

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Algoritmos y Estructuras de Datos
Cursada 2021

Prof. Alejandra Schiavoni (ales@info.unlp.edu.ar)

Prof. Catalina Mostaccio (catty@lifia.info.unlp.edu.ar)

Prof. Laura Fava (lfava@info.unlp.edu.ar)

Prof. Pablo Iuliano (piuliano@info.unlp.edu.ar)


Agenda
 Temas de la materia
 Objetivos de la materia
 Introducción al Análisis de Algoritmos
 Repaso de Recursión

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Temas del curso

 Árboles
 Análisis de Algoritmos
 Cola de Prioridades
 Grafos

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Objetivos de la materia
 Analizar algoritmos y evaluar su
eficiencia

 Estudiar estructuras de datos


avanzadas: su implementación y
aplicaciones

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
modificaciones.
Ejemplo:

Modelando la realidad con EEDD


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
modificaciones.
Ejemplo:

Modelando la realidad con EEDD


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
modificaciones.
Ejemplo:

Modelando la realidad con EEDD


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
modificaciones.
Ejemplo:

Datos sin organización


Datos: libros

Modelando la realidad con EEDD


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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
modificaciones.
Ejemplo:

Datos sin organización Datos organizados en una estructura


Datos: libros Estructura de datos: biblioteca

Modelando la realidad con EEDD


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
¿De qué se trata el curso?
Estudiar formas inteligentes de organizar la información, de
forma tal de obtener algoritmos eficientes.

Listas, Pilas, Colas Insertar

Árboles Binarios Borrar

Árboles Generales Buscar

Heaps Caminos mínimos

Grafos Ordenación
Estructuras de Datos Algoritmos
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Las estructuras de datos y sus
algoritmos son….
Computación Seguridad
Multimedia
Gráfica
Biología Inteligencia Artificial

Internet Física

Utilizados en todos lados!

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Ejemplo 1: Árbol de carpetas y archivos

Nodos: Carpetas/Archivos
Aristas: representan la relación “contiene”

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Ejemplo 2: Prerrequisitos de un curso

Nodos: Cursos
Aristas: relación de “prerrequisito”

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Ejemplo 3: Representación de una expresión
en un compilador

Nodos: Operandos/Operadores
Aristas: representan las relaciones entre las operaciones

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Ejemplo 4: Esquema de una red informática

Nodos: Equipos
Aristas: representan las conexiones
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Ejemplo 5: Mapa de ciudades

Nodos: Ciudades
Aristas: Rutas

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Estructuras de Datos:
Qué, Cómo y Por qué?

 Los programas reciben, procesan y devuelven


datos
 Necesidad de organizar los datos de acuerdo
al problema que vamos a resolver

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Estructuras de Datos:
Qué, Cómo y Por qué?

 Los programas reciben, procesan y devuelven


datos
 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
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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:

Implementación de algunas operaciones: pueden


resultar más fácil o más difícil
La velocidad del programa: puede aumentar o
disminuir
La memoria usada: puede aumentar o disminuir

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Objetivos del curso respecto de las
Estructuras de Datos

 Aprender a implementar las estructuras de datos


usando abstracción

 Estudiar diferentes representaciones e


implementaciones para las estructuras de datos

 Aprender a elegir la “mejor” estructura de datos


para cada problema

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Algoritmos y su Análisis
 ¿Qué es un algoritmo?
Es una secuencia de pasos que resuelven un problema
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
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

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Objetivos del curso respecto del
Análisis de los Algoritmos
 Entender los fundamentos matemáticos necesarios
para analizar algoritmos

 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
usarlos para resolver nuevos problemas

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Problemas y algoritmos

 Problemas:
 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


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en un
arreglo

El arreglo puede estar:


• desordenado
• ordenado

Si el arreglo está desordenado

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

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en un
arreglo

El arreglo puede estar:


• desordenado
• ordenado

Si el arreglo está desordenado Búsqueda secuencial

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

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Algoritmo: Búsqueda secuencial

public static int seqSearch(int[] a, int


key)
{
int index = -1;
for (int i = 0; i < N; i++)
if (key == a[i])
index = i;
return index;
}

¿Cuántas comparaciones hace?

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en un
arreglo
El arreglo puede estar:
• desordenado
• ordenado
Si el arreglo está ordenado

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en un
arreglo
El arreglo puede estar:
• desordenado
• ordenado
Búsqueda binaria: Comparo la clave con
Si el arreglo está ordenado la entrada del centro
• Si es menor, voy hacia la izquierda
• Si es mayor, voy hacia la derecha
• Si es igual, la encontré

lo mid hi
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Algoritmo: Búsqueda binaria

Adivinar número - Búsqueda lineal o binaria

https://es.khanacademy.org/computing/computer-
science/algorithms/intro-to-algorithms/a/a-guessing-game

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Algoritmo: Búsqueda binaria
public static int binarySearch(int[] a, int key)
{
int lo = 0, hi = a.length-1;
while (lo <= hi)
{
int mid = lo + (hi - lo) / 2;
if (key < a[mid]) hi = mid - 1;
else if (key > a[mid]) lo = mid + 1;
else return mid;
}
return -1;
}

¿Cuántas comparaciones hace?


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
¿Cuántas operaciones hace
cada algoritmo?
N Cantidad de N Cantidad de
operaciones operaciones
1000 1000 1000 ~10

2000 2000 2000 ~11


Búsqueda Búsqueda
secuencial 4000 4000 4000 ~12 binaria

8000 8000 8000 ~13

16000 16000 16000 ~14

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
¿Cuántas operaciones hace
cada algoritmo?
N Cantidad de N Cantidad de
operaciones operaciones
1000 1000 1000 ~10

2000 2000 2000 ~11


Búsqueda Búsqueda
secuencial 4000 4000 4000 ~12 binaria

8000 8000 8000 ~13

16000 16000 16000 ~14

Hace N operaciones Hace log(N) operaciones


Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
¿Cómo medir el tiempo?

En forma empírica


Se realiza a posteriori

En forma teórica


Se realiza a priori

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Análisis empírico
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) N Tiempo (seg)

1000 1000 1000 ~10

Búsqueda 2000 2000 2000 ~11 Búsqueda


secuencial binaria
4000 4000 ~ 1 hs. 4000 ~12

8000 8000 ~ 2 hs 8000 ~13

16000 16000 ~ 4 hs. 16000 ~14

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Análisis de Algoritmos

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Cantidad de operaciones de la
búsqueda binaria
Ejercitación

https://es.khanacademy.org/computing/computer-
science/algorithms/binary-search/e/running-time-of-binary-
search

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
• desordenada
• ordenada

¿Cómo sería el algoritmo de búsqueda?


primero

6 10 2 50
null

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
• desordenada
• ordenada

¿Cómo sería el algoritmo de búsqueda?


primero

6 10 2 50
null

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
• desordenada
• ordenada

¿Cómo sería el algoritmo de búsqueda? ¿Cuántas


comparaciones
primero
hace?
6 10 2 50
null

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Caso: Buscar un elemento en una
lista dinámica
Si los elementos están almacenados en una lista dinámica
La lista puede estar:
• desordenada
• ordenada

¿Cómo sería el algoritmo de búsqueda? ¿Cuántas


comparaciones
primero
hace?
6 10 2 50
null
Hace N comparaciones

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
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

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Análisis de Algoritmos

Factores Factores
independientes dependientes del
del sistema sistema Hardware:
Algoritmo
CPU, memoria

Software:
Entrada de
lenguaje,
datos
compilador, ..

Sistema: SO,
red, otras
aplicaciones

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Análisis de Algoritmos

Factores Factores
independientes dependientes del
del sistema sistema Hardware:
Algoritmo
CPU, memoria

Software:
Entrada de
lenguaje,
datos cantidad y compilador, ..
distribución

Sistema: SO,
Cómo se comporta el red, otras
Algoritmo dependiendo aplicaciones
de la entrada de datos.
Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio Algoritmos y Estructuras de Datos 2021
Análisis de Algoritmos
Existe un modelo matemático para medir el tiempo

Tiempo total:
Suma del costo x frecuencia de todas las
operaciones

• Es necesario analizar el algoritmo para determinar el conjunto de


operaciones

• Costo depende de la máquina, del compilador, del lenguaje


• Frecuencia depende del algoritmo y de la entrada

Prof. Alejandra Schiavoni – Prof. Catalina Mostaccio 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()

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.

public class Vehiculo { public class Test {


private String marca; public static void main(String args[]){
private double precio; Vehiculo auto;
. . . auto = new Vehiculo();
} }
}

Objeto
ca()
Vehiculo gerMar

aggr acto
ont
etePgre
arcCio()
marca=null
precio=0.0
...

. .
auto null auto 0x99f311 .

Memoria STACK
Memoria STACK Memoria HEAP
Algoritmos y Estructuras de Datos 2021
¿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. public class Vehiculo {
• Son invocados automáticamente. private String marca;
private double precio;

public Vehiculo() {
}
} NO retorna nada

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.

- 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.
Algoritmos y Estructuras de Datos 2021
Constructor sin argumentos
Un constructor sin argumento o constructor Default, es usado para crear un objeto básico.

• Si una clase NO tiene constructores, el compilador inserta automáticamente un


constructor default, con cuerpo vacío:
public class Vehiculo {
private String marca; Cuando se compila
private double precio;
public Vehiculo(){
}
//métodos
}

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.

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.

public class Vehiculo { Codificaciones


private String marca; equivalentes
private double precio;

public Vehiculo(String mar,double pre){ public Vehiculo(String marca,double precio) {


marca = mar; this.marca = marca;
precio = pre; this.precio = precio;
} }
}

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);
}
}
Algoritmos y Estructuras de Datos 2021
Sobrecarga de Constructores
¿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.

public class Vehiculo {


private String nroPatente=“”;
private String propietario=“SinDueño”;
public Vehiculo(){
}
public Vehiculo(String marca){ La sobrecarga de métodos
this.marca = marca; permite que el mismo nombre de
} método sea usado con distintos
public Vehiculo(String marca,double precio){ tipos y cantidad de argumentos.
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);
}
}

Algoritmos y Estructuras de Datos 2021


this() y this
public class Vehiculo {
this() private String marca;
Cuando dentro de una clase, hay más de private double precio;
un constructor, se pueden invocar entre public Vehiculo(String marca){
ellos para evitar duplicar código. // podría tener más código
Para hacer esto se puede usar this(), el this.marca = marca;
cual hace una invocación a otro constructor }
de la misma clase que coincida con la lista public Vehiculo(String marca,double precio){
de argumentos. this(marca); // debe estar en la 1º línea
this.precio = precio;
}
this
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?

public class Vehiculo { Vehiculo a1 = new Vehiculo();


private String marca; Vehiculo a2 = new Vehiculo();
private String precio; . . .
. . . a1.setMarca(“CITROEN”);
public setMarca(String marca){ a2.setMarca(“HONDA”);
this.marca = marca;
} El compilador agrega como 1º argumento de cada método
} una referencia al objeto que está siendo manipulado.

Algoritmos y Estructuras de Datos 2021


ANEXO

Algoritmos y Estructuras de Datos 2021


Cadena de invocación a constructores
¿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:

Constructor de La clase Object


crear un objeto de tipo Object
Object()
La clase Vertebrado crear un objeto de tipo Vertebrado
Constructor de
Vertebrado()
La clase Mamifero crear un objeto de tipo Mamifero
Constructor de
Mamífero() crear un objeto de tipo Perro
La clase Perro

new Perro() Estoy listo!

En cada constructor de una clase derivada, debe existir una llamada a un


constructor de la superclase.
Algoritmos y Estructuras de Datos 2021
Cadena de invocación a constructores
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.
public class Perro extends Mamifero{ public class Mamifero extends Vertebrado {
. . public Mamifero(){
public Perro(){ super(); // si no se pone, igual se invoca
super(); // si no se pone, igual se invoca System.out.println(“Constructor de Mamifero”);
System.out.println(“Constructor de Perro”); }
} public void comer(){
public void comer(){ } }
} }

La clase Object
super() public class Vertebrado {
public Vertebrado (){
La clase Vertebrado super(); // si no se pone, igual se invoca
super() System.out.println(“Constructor de Vertebrado”);
}
La clase Mamifero
}
super()
La clase Perro

new Perro()

¿Cuál sería la salida de la


ejecución de
new Perro()?
Algoritmos y Estructuras de Datos 2021
Cadena de invocación a constructores
¿Qué pasa si Vertebrado tiene un constructor con argumentos y no tiene el
constructor sin argumentos (default)?
public class Perro extends Mamifero{ public class Mamifero extends Vertebrado {
. . public Mamifero(){ super()
public Perro(){ super() System.out.println(“Constructor de Mamifero”);
System.out.println(“Constructor de Perro”); }
} public void comer(){
public void comer(){ } }
} }

La clase Object
super() public class Vertebrado {
private int cantpatas; super()
La clase Vertebrado
public Vertebrado (int i){
Error!!
super() cantpatas = c;
La clase Mamifero System.out.println(“Constructor de Vertebrado”);
}
super() La clase Perro }

new Perro()

¿Cómo hacemos?
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.

Algoritmos y Estructuras de Datos 2021


Cadena de invocación a constructores
¿Qué pasa si Vertebrado tiene un constructor con argumentos y no tiene el
constructor sin argumentos (default)? continuación
public class Perro extends Mamifero{ public class Mamifero extends Vertebrado {
. . public Mamifero(){
public Perro(){ super() super(4);
System.out.println(“Constructor de Perro”); System.out.println(“Constructor de Mamifero”);
} }
public void comer(){ } public void comer(){}
} }

public class Vertebrado { La clase Object


private int cantpatas; super()
public Vertebrado(int c){
super() La clase Vertebrado
cantpatas = c;
System.out.println(“Constructor de Vertebrado”); super(4)
} La clase Mamifero
public void comer(){}
} super()
La clase Perro
Perro p = new Perro()

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.
Algoritmos y Estructuras de Datos 2021
super() y super
super()
Super() invoca a un constructor de la superclase public class Perro extends Mamifero {
y debe estar en la primer línea de código del private String sonido;
constructor. se invoca al constructor de
JAVA garantiza la correcta creación de los public Perro(){ Mamifero con
objetos ya que los constructores siempre super(4); argumento de tipo entero.
invocan a los constructores de la superclase. De sonido=new String(“guau”);
esta manera todo objeto contiene una referencia }
al objeto de la superclase habilitando la . . .
}
herencia de estado y comportamiento.
En este ejemplo, el código del constructor
Perro() espera hasta que el padre se inicialice
para continuar con su código.

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.

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Estructura

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Código Fuente
package tp03.ejercicio1; public void agregarHijoIzquierdo(ArbolBinario<T> hijo) {
public class ArbolBinario<T> { this.hijoIzquierdo = hijo;
private T dato; }
private ArbolBinario<T> hijoIzquierdo;
public void agregarHijoDerecho(ArbolBinario<T> hijo) {
private ArbolBinario<T> hijoDerecho;
this.hijoDerecho = hijo;
}
public ArbolBinario() { Constructores public void eliminarHijoIzquierdo() {
super();
this.hijoIzquierdo = null;
}
}
public ArbolBinario(T dato) {
public void eliminarHijoDerecho() {
this.dato = dato;
this.hijoDerecho = null;
}
}
Arbol vacío
public T getDato() { public boolean esVacio() {
return dato; return (this.esHoja() && this.getDato()==null);
} }
public boolean esHoja() {
public void setDato(T dato) { return (!this.tieneHijoIzquierdo() &&
this.dato = dato; !this.tieneHijoDerecho());
} }
public ArbolBinario<T> getHijoIzquierdo() { public boolean tieneHijoIzquierdo() {
return this.hijoIzquierdo; return this.hijoIzquierdo!=null;
} }
public ArbolBinario<T> getHijoDerecho() {
return this.hijoDerecho; public boolean tieneHijoDerecho() {
} return this.hijoDerecho!=null;
}
}

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Creación

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

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Recorrido PreOrden

Se procesa primero la raíz y luego sus hijos, izquierdo y derecho

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Recorrido PreOrden

Qué cambio harias si el método preorden() debe definirse en otra clase diferente al ArbolBinario<T>?

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Recorrido PreOrden
Qué cambio harías para devolver una lista con los elementos de un recorrido en preorden?

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Recorrido por Niveles
Recorrido implementado en la clase ArbolBinario

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Es árbol 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”
public boolean lleno() {
ArbolBinario<T> arbol = null;
ColaGenerica<ArbolBinario<T>> cola = new ColaGenerica<ArbolBinario<T>>();
boolean lleno = true; Nivel/Prof
cola.encolar( this);
int cant_nodos=0; 0
cola.encolar( null);
int nivel= 0; 1
while (!cola.esVacia() && lleno) {
arbol = cola.desencolar(); 2
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()); cola
cant_nodos++;
} 1 null 2 5
} else if (!cola.esVacia()) {
if (cant_nodos == Math.pow(2, ++nivel)){
cola.encolar( null);
arbol = cola.desencolar();
cant_nodos=0;
System. out.println(); arbol = null
} cant_nodos = 2
else lleno=false;}
}
return lleno;
}
Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Árbol de Expresión

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

* +
+ c d e
a b

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Convertir expresión posfija en árbol de Expresión
Este método convierte una expresión postfija en un ArbolBinario. Puede estar
implementado en cualquier clase.
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()); * +
} ab+c*de+/ + c d e
a b
Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Convertir expresión prefija en árbol de expresión
Este método convierte una expresión prefija en un ArbolBinario. Puede estar
implementado en cuaquier clase.

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; /
}

* +
/*+abc+de + c d e
a b
Algoritmos y Estructuras de Datos 2021
Arboles Binarios
Evaluación de un Árbol de Expresión
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.

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()); retorna 9
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; * +
}
} + 9 2 1
// es operando
return Integer.parseInt(c.toString());
} 1 2

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

Algoritmos y Estructuras de Datos 2021


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.
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()+")";
}
}

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Árbol de Frecuencia Natural - Solución recursiva
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;
}

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Árbol de Frecuencia Natural - Solución iterativa
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;
}

Algoritmos y Estructuras de Datos 2021


Arboles Binarios
Árbol de Frecuencia Natural - Construcción
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");
}

Algoritmos y Estructuras de Datos 2021

También podría gustarte