Tema 2 diccionarios_grupo_23

46
Análisis y Diseño de Software Departamento de Ingeniería de Sistemas Telemáticos http://moodle.dit.upm.es Tema 2b. Diccionarios. Arrays y Árboles Carlos A. Iglesias <[email protected]>

description

Diccionarios. Arrays y Árboles Binarios de Búsqueda.

Transcript of Tema 2 diccionarios_grupo_23

Page 1: 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]>

Page 2: Tema 2 diccionarios_grupo_23

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

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

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

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

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

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

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

Diccionarios. Arrays y Árboles 9

Interfaz Diccionario

Page 10: Tema 2 diccionarios_grupo_23

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

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

Diccionarios. Arrays y Árboles 12

Problema

● Programar DiccionarioArray– Implementa Diccionario– Usa arrays

Page 13: Tema 2 diccionarios_grupo_23

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

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

Diccionarios. Arrays y Árboles 15

Adivina un número entre 0 y 50 ...

¿Quépreguntaríamos?

Page 16: Tema 2 diccionarios_grupo_23

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

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

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

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

Diccionarios. Arrays y Árboles 20

Ahora, a programar...

Page 21: Tema 2 diccionarios_grupo_23

Diccionarios. Arrays y Árboles 21

Clases vistas

● Diccionario.java

● TestDiccionario.java

● BancoPruebasDiccionarioOrdenado.java

● DiccionarioArray.java

● DiccionarioArrayOrdenado.java

Page 22: Tema 2 diccionarios_grupo_23

Diccionarios. Arrays y Árboles 22

Medimos tiempos...

Page 23: Tema 2 diccionarios_grupo_23

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

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

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

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

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

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

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

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

Diccionarios. Arrays y Árboles 31

Inserción

Page 32: Tema 2 diccionarios_grupo_23

Diccionarios. Arrays y Árboles 32

Ej. Inserción

Page 33: Tema 2 diccionarios_grupo_23

Diccionarios. Arrays y Árboles 33

Ejemplo

Page 34: Tema 2 diccionarios_grupo_23

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

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

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

Diccionarios. Arrays y Árboles 38

Borrado sin hijos

Borrar 74

Page 38: Tema 2 diccionarios_grupo_23

Diccionarios. Arrays y Árboles 39

Borrado nodo con 1 hijo

Borrar 70

Page 39: Tema 2 diccionarios_grupo_23

Diccionarios. Arrays y Árboles 40

Borrado con 2 hijos

Borrar 59

Page 40: Tema 2 diccionarios_grupo_23

Diccionarios. Arrays y Árboles 41

Ej. Borrado con 2 hijos

Borrar I

Page 41: Tema 2 diccionarios_grupo_23

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

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

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

Diccionarios. Arrays y Árboles 45

Clases vistas

● DiccionarioArbol.java●TestDiccionarioArbol.java

Page 45: Tema 2 diccionarios_grupo_23

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

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)