Tema 2 diccionarios_grupo_23
-
Upload
carlos-a-iglesias -
Category
Technology
-
view
216 -
download
0
description
Transcript of Tema 2 diccionarios_grupo_23
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]>
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
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
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
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
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
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
Diccionarios. Arrays y Árboles 8
Requisitos diccionario
● Búsqueda rápida
● Inserción rápida
● Borrado rápido
Diccionarios. Arrays y Árboles 9
Interfaz Diccionario
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);}
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;
}}
Diccionarios. Arrays y Árboles 12
Problema
● Programar DiccionarioArray– Implementa Diccionario– Usa arrays
Diccionarios. Arrays y Árboles 13
Caso de estudio (1)
3 2 4 1
¿Cómo inserto, borro, y busco en este array?
Diccionarios. Arrays y Árboles 14
Caso de estudio (2)
1 2 3 4
¿Cómo inserto, borro, y busco en este array?
Diccionarios. Arrays y Árboles 15
Adivina un número entre 0 y 50 ...
¿Quépreguntaríamos?
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
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)
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)
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)
Diccionarios. Arrays y Árboles 20
Ahora, a programar...
Diccionarios. Arrays y Árboles 21
Clases vistas
● Diccionario.java
● TestDiccionario.java
● BancoPruebasDiccionarioOrdenado.java
● DiccionarioArray.java
● DiccionarioArrayOrdenado.java
Diccionarios. Arrays y Árboles 22
Medimos tiempos...
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?
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);
Diccionarios. Arrays y Árboles 25
Árboles binarios
● Vamos a ver cómo evitar 'reordenar' con O(n)
● Los árboles binarios nos facilitan esto
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
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
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
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
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
Diccionarios. Arrays y Árboles 31
Inserción
Diccionarios. Arrays y Árboles 32
Ej. Inserción
Diccionarios. Arrays y Árboles 33
Ejemplo
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
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
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
Diccionarios. Arrays y Árboles 38
Borrado sin hijos
Borrar 74
Diccionarios. Arrays y Árboles 39
Borrado nodo con 1 hijo
Borrar 70
Diccionarios. Arrays y Árboles 40
Borrado con 2 hijos
Borrar 59
Diccionarios. Arrays y Árboles 41
Ej. Borrado con 2 hijos
Borrar I
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
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)
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)
Diccionarios. Arrays y Árboles 45
Clases vistas
● DiccionarioArbol.java●TestDiccionarioArbol.java
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
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)