tema 2 diccionarios_grupo_23
DESCRIPTION
Diccionarios. Arrays y Árboles Binarios de Búsqueda.TRANSCRIPT
![Page 1: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/1.jpg)
Análisis y Diseño de Software
Departamento de Ingeniería de Sistemas Telemáticoshttp://moodle.dit.upm.es
Tema 2b.Diccionarios. Arrays y Árboles
Carlos A. Iglesias <[email protected]>
![Page 2: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/2.jpg)
Diccionarios. Arrays y Árboles 2
Teoría
Ejercicio práctico en el ordenador
Ampliación de conocimientos
Lectura / Vídeo / Podcast
Práctica libre / Experimentación
Explicación en pizarra
Legenda
![Page 3: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/3.jpg)
Diccionarios. Arrays y Árboles 3
Bibliografía
● Beginning Algorithms, Simon Harris and James Ross, Wrox, 2005.
● Capítulos 1, 2, 9, 10, 11
http://proquest.safaribooksonline.com/book/software-engi
neering-and-development/algorithms/9780764596742
![Page 4: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/4.jpg)
Diccionarios. Arrays y Árboles 4
Temario
● Estructura de datos: diccionarios
● Operaciones en diccionarios: interfaz diccionario
● Implementación de diccionario– Interfaz Comparable– Array– Array Ordenado– Árbol binario para búsqueda
![Page 5: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/5.jpg)
Diccionarios. Arrays y Árboles 5
Objetivos
● Aprender nuevas estructuras de datos, ampliamente usadas para diccionarios
● Saber calcular, evaluar y razonar sobre la complejidad de las operaciones de un diccionario
● Practicar la programación de métodos recursivos e iterativos para recorrer estas estructuras
![Page 6: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/6.jpg)
Diccionarios. Arrays y Árboles 6
El problema del diccionario
● Tenemos pares clave-elemento– Ej. Palabra y definición de la palabra
● ¿Cómo insertar, borrar o buscar elementos dada su clave?
Juan1
Ana3
Pedro5
Fernando6
Marcos4
CLAVE ELEMENTO
insertar
buscar(1)
Marga7Juan1
![Page 7: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/7.jpg)
Diccionarios. Arrays y Árboles 7
El problema diccionario
● Un diccionario es un 'mapping' entre dos conjuntos de items, K y V, que debe soportar:– Inserción de un elemento v dada una clave k– Búsqueda de un elemento dada su clave k– Borrado de un elemento dada una clave k
K
3
5
Juan
Ana
Pedro
1
V
![Page 8: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/8.jpg)
Diccionarios. Arrays y Árboles 8
Requisitos diccionario
● Búsqueda rápida
● Inserción rápida
● Borrado rápido
![Page 9: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/9.jpg)
Diccionarios. Arrays y Árboles 9
Interfaz Diccionario
![Page 10: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/10.jpg)
Diccionarios. Arrays y Árboles 10
Ordenar objetos en Java● En Java para ordenar, usamos al interfaz Comparable
● int c = a.compareTo(b)
● Orden:– c < 0 → a < b– c == 0 → a == b– c > 0 → a > b
● Al implementar Comparable, tenemos que cumplir:– x.compareTo(y) == 0 ↔ x.equals(y)– Transitividad. Si x.compareTo(y) > 0 && y.compareTo(z) > 0 →
x.compareTo(z) > 0– Si x.compareTo(y) == 0 →
signo(x.compareTo(z)) == signo(y.compareTo(z)), para todo z
interface Comparable<T> { int compareTo(T o);}
![Page 11: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/11.jpg)
Diccionarios. Arrays y Árboles 11
Ejemplo
public class Persona implements Comparable {private String nombre;private String apellido;private int edad;
public int compareTo(Persona otra) {int c1 = apellido.compareTo(otra.apellido);if (c1 != 0) { return c1;}int c2 = nombre.compareTo(otra.nombre);if (c2 !=0) {return c2;}return otra.edad – edad;
}}
![Page 12: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/12.jpg)
Diccionarios. Arrays y Árboles 12
Problema
● Programar DiccionarioArray– Implementa Diccionario– Usa arrays
![Page 13: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/13.jpg)
Diccionarios. Arrays y Árboles 13
Caso de estudio (1)
3 2 4 1
¿Cómo inserto, borro, y busco en este array?
![Page 14: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/14.jpg)
Diccionarios. Arrays y Árboles 14
Caso de estudio (2)
1 2 3 4
¿Cómo inserto, borro, y busco en este array?
![Page 15: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/15.jpg)
Diccionarios. Arrays y Árboles 15
Adivina un número entre 0 y 50 ...
¿Quépreguntaríamos?
![Page 16: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/16.jpg)
Diccionarios. Arrays y Árboles 16
Búsqueda binaria – Arrays.binarySearch()
● Si sabemos que está ordenado, – Dividimos el array por su elemento medio.
– Comparamos con el elemento del centro. Si coincide, terminamos. Si el elemento es menor, debe estar en el subarray de la izda, y si es mayor en el de la derecha. Seguimos haciendo esto hasta encontrarlo• Ej. [1,2,3,4,5,6,7,8,9] y busco el 3
• [1,2,3,4]-5-[6,7,8,9] como 3 es menor que 5
• [1]-2-[3 ,4] como 3 es menor que 2 → []-3-[4] → Encontrado
![Page 17: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/17.jpg)
Diccionarios. Arrays y Árboles 17
Complejidad Búsqueda lineal
● Buscar – search– Recorremos → O(n)
● Insertar - put– Añadimos al final, sin detectar duplicados → O(1)
● Recuperar - get– Buscamos el elemento → O(n)
● Borrar - remove– Buscamos y lo borramos → O(n)
![Page 18: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/18.jpg)
Diccionarios. Arrays y Árboles 18
ComplejidadBúsqueda binaria
● Buscar - search– O(logn)
● Insertar - put– Busco + reordeno hasta el final → O(n)
● Recuperar - get– Busco → O(logn)
● Borrar - remove– Busco + reordeno tras borrar → O(n)– Si sólo marco como borrado: Busco + marco → O(logn)
![Page 19: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/19.jpg)
Diccionarios. Arrays y Árboles 19
Complejidad
Algoritmo search put get remove
Búsqueda lineal O(n) O(1) O(n) O(n)
Búsqueda binaria iterativa O(logn) O(n) O(logn) O(n)
Búsqueda binaria recursiva O(logn) O(n) O(logn) O(n)
Algoritmo search put get remove
Búsqueda lineal O(1) O(1) O(1) O(1)
Búsqueda binaria iterativa O(1) O(1) O(1) O(1)
Búsqueda binaria recursiva O(logn) O(logn) O(logn) O(logn)
T(n)
E(n)
![Page 20: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/20.jpg)
Diccionarios. Arrays y Árboles 20
Ahora, a programar...
![Page 21: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/21.jpg)
Diccionarios. Arrays y Árboles 21
Clases vistas
● Diccionario.java
● TestDiccionario.java
● BancoPruebasDiccionarioOrdenado.java
● DiccionarioArray.java
● DiccionarioArrayOrdenado.java
![Page 22: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/22.jpg)
Diccionarios. Arrays y Árboles 22
Medimos tiempos...
![Page 23: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/23.jpg)
Diccionarios. Arrays y Árboles 23
¿Cómo podría mejorar búsqueda binaria?
● ¿Qué molesta?– → REORDENAR al insertar o borrar
● “Ordeno de forma perezosa” (lazy sorting)– Sólo cuando me hace falta
● Alternativas:– Inserción ordenada + búsqueda binaria– Inserción no ordenada + búsqueda lineal– Inserción + ordenación perezosa + búsq. Binaria
●¿Cuándo cojo cada una?
![Page 24: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/24.jpg)
Diccionarios. Arrays y Árboles 24
Ordenación perezosa
● Insertar al final y marcar que no está ordenado
● Ordenamos antes de buscar con búsqueda binaria
data[pos++] = nuevoDato; ordenado = false;
if !ordenado { Arrays.sort(data); ordenado = true;}return busqueda(datos, dato);
![Page 25: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/25.jpg)
Diccionarios. Arrays y Árboles 25
Árboles binarios
● Vamos a ver cómo evitar 'reordenar' con O(n)
● Los árboles binarios nos facilitan esto
![Page 26: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/26.jpg)
Diccionarios. Arrays y Árboles 26
¿Qué son los árboles binarios (binary trees)?
●“Árboles”-> estructura Tree– con nodos– Cada nodo tiene un padre
● “Binarios”– Cada padre tiene 2 hijos
![Page 27: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/27.jpg)
Diccionarios. Arrays y Árboles 27
Árboles binarios
● La altura de un nodo es el número de enlaces desde ese nodo hasta el nodo más profundo
● La altura de un árbol es la altura del nodo raíz
![Page 28: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/28.jpg)
Diccionarios. Arrays y Árboles 28
Árbol binario lleno y completo
● Un árbol binario lleno es aquel en que cada nodo tiene 0 ó 2 hijos (no 1)
● Un árbol binario completo es un árbol binario completamente lleno, con la posible excepción del último nivel
![Page 29: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/29.jpg)
Diccionarios. Arrays y Árboles 29
Árbol binario completo
● Un árbol binario completo proporciona la mejor relación entre número de nodos y la altura
● La altura h de un árbol binario completo de N nodos es h = O(log n) ya que
n=1+2+4+...+2h−1+2h=2h+1−1
![Page 30: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/30.jpg)
Diccionarios. Arrays y Árboles 30
Árboles binarios de búsqueda (Binary search trees)
● “Árboles binarios” en que además– La rama izquierda de un nodo sólo tiene
valores menores que dicho nodo– La rama derecha de un nodo sólo tiene
valores mayores que dicho nodo– No hay duplicados
![Page 31: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/31.jpg)
Diccionarios. Arrays y Árboles 31
Inserción
![Page 32: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/32.jpg)
Diccionarios. Arrays y Árboles 32
Ej. Inserción
![Page 33: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/33.jpg)
Diccionarios. Arrays y Árboles 33
Ejemplo
![Page 34: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/34.jpg)
Diccionarios. Arrays y Árboles 34
Ejercicio
● Crear un árbol binario con los siguientes números (insertar en este orden):
● 11, 6, 8, 19, 4, 10, 5, 17, 43, 49, 31
![Page 35: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/35.jpg)
Diccionarios. Arrays y Árboles 36
Complejidad T(n)
● En árboles completos, lo peor sería que tengamos que dar tantos saltos como la altura del árbol → O(log n)
● PERO si el árbol no es completo, y es degenerado, p.ej. Si los datos son ordenados: (1 (2 (3 ( 4 (5)) → O(n)
12
34
5
![Page 36: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/36.jpg)
Diccionarios. Arrays y Árboles 37
Borrado
● Casos– Nodo sin hijos → lo borramos– Nodo con 1 hijo → lo borramos y lo
reemplazamos por el hijo– Nodo con 2 hijos →buscamos el mayor hijo
izado o el menor hijo derecho y reemplazamos por el que queremos borrar
![Page 37: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/37.jpg)
Diccionarios. Arrays y Árboles 38
Borrado sin hijos
Borrar 74
![Page 38: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/38.jpg)
Diccionarios. Arrays y Árboles 39
Borrado nodo con 1 hijo
Borrar 70
![Page 39: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/39.jpg)
Diccionarios. Arrays y Árboles 40
Borrado con 2 hijos
Borrar 59
![Page 40: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/40.jpg)
Diccionarios. Arrays y Árboles 41
Ej. Borrado con 2 hijos
Borrar I
![Page 41: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/41.jpg)
Diccionarios. Arrays y Árboles 42
Borrado perezoso
● En vez de borrar físicamente, marcamos para borrado– Más simple– Podemos hacer los borrados físicos 'de golpe'
(y en batch)– Pero, necesitaremos más memoria para los
nodos marcados como borrados, y se tardará más en otras operaciones
![Page 42: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/42.jpg)
Diccionarios. Arrays y Árboles 43
Complejidad● Buscar - search
– Si es completo y balanceado, O(h) → O(logn)– Si degenera, O(n)
● Insertar - put– Buscar + insertar en ese nodo → O(logn)
● Recuperar – get– Buscar → O(logn)
● Borrar - delete– Buscar nodo + buscar reemplazo + insertar reemplazo en
nodo original → O(logn)+O(logn)+1 → O(logn)
![Page 43: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/43.jpg)
Diccionarios. Arrays y Árboles 44
Complejidad
Algoritmo search put get remove
Búsqueda lineal O(n) O(1) O(n) O(n)
Búsqueda binaria iterativa O(logn) O(n) O(logn) O(n)
Búsqueda binaria recursiva O(logn) O(n) O(logn) O(n)
Árbol binario de búsqueda O(logn) O(logn) O(logn) O(logn)
Algoritmo search put get remove
Búsqueda lineal O(1) O(1) O(1) O(1)
Búsqueda binaria iterativa O(1) O(1) O(1) O(1)
Búsqueda binaria recursiva O(logn) O(logn) O(logn) O(logn)
Árbol binario de búsqueda O(n) O(n) O(n) O(n)
T(n)
E(n)
![Page 44: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/44.jpg)
Diccionarios. Arrays y Árboles 45
Clases vistas
● DiccionarioArbol.java●TestDiccionarioArbol.java
![Page 45: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/45.jpg)
Diccionarios. Arrays y Árboles 46
“La búsqueda es una herramienta básica que cada programador debería conocer para utilizar en un gran número de ocasiones”
Donald Knuth, “El Arte de Programación de Ordenadores”, Vol. 3, 1973.
Conclusiones - Búsqueda
![Page 46: Tema 2 diccionarios_grupo_23](https://reader033.vdocuments.pub/reader033/viewer/2022052621/558897f2d8b42a467d8b4634/html5/thumbnails/46.jpg)
Diccionarios. Arrays y Árboles 47
Resumen
● Tenemos diferentes algoritmos para ordenar y buscar
● Las pruebas de prestaciones nos permiten medirlos– Es difícil (elementos externos como la máquina
o GC en Java)
● Hemos visto dos algoritmos de búsqueda: lineal y binaria (para arrays ordenados)