Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al...

40
Estructuras de datos Listas y árboles Dra. Elisa Schaeffer [email protected] PISIS / FIME / UANL Listas y ´ arboles– p. 1

Transcript of Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al...

Page 1: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Estructuras de datos

Listas y árboles

Dra. Elisa Schaeffer

[email protected]

PISIS / FIME / UANL

Listas y arboles– p. 1

Page 2: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Listas

Listas son estructuras un poco más avanzadas que purosarreglos, como típicamente permiten ajustesnaturales desu capacidad.

Una lista enlazada (inglés: linked list) consiste deelementos que todos contengan además de su dato, unpuntero al elemento siguiente.

Listas y arboles– p. 2

Page 3: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Añadir elementos

Si el orden de los elementos no está activamentemantenido, es fácil agregar un elemento en la lista:

Crear el elemento nuevo.

Inicializar su puntero del siguiente elemento a nulo.

Hacer que el puntero del siguiente del ultimoelementoactualmente en la lista punte al elementonuevo.

Listas y arboles– p. 3

Page 4: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Acceso a la lista

Para acceder la lista, hay que mantener un puntero alprimer elemento.

Si también se mantiene un puntero al último elemento,añadir elementos cuesta O (1) unidades de tiempo,mientras solamente utilizando un puntero al comienzo, senecesita tiempo O (n), donde n es el número de elementosen la lista.

Listas y arboles– p. 4

Page 5: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Mantener el orden

Si uno quiere mantener el orden mientras realizandoinserciones y eliminaciones, hay que primero ubicar elelemento anterioral punto de operación en la lista:

para insertar un elemento nuevo v inmediatamentedespués del elemento u actualmente en la lista, hayque ajustar los punteros tal que el puntero delsiguiente v.sig de v tenga el valor de u.sig, después deque se cambia el valor de u.sig a puntar a v;

para eliminar un elemento v, el elemento anteriorsiendo u, primero hay que asignar u.sig := v.sig ydespués simplemente eliminar v, a que ya no hayreferencia de la lista.

Listas y arboles– p. 5

Page 6: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Listas doblemente enlazadas

Una lista doblemente enlazadatiene además en cadaelemento un enlace al elemento anterior.

Su mantenimiento es un poco más laborioso por tener queactualizar más punteros por operación, pero hayaplicaciones en las cuales su eficacia es mejor.

Con listas, ganamos tamaño dinámico, pero búsquedas yconsultas de elementos ahora tienen costo O (n) mientrascon arreglos tenemos acceso en tiempo O (1) y tamaño“rígido”.

Listas y arboles– p. 6

Page 7: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Pilas

Una pila (inglés: stack) es una lista especial donde todaslas operaciones están con el primer elemento de la lista.

Se añade al frente y remueve del frente.

Implementar como una lista enlazada manteniendo unpuntero p al primer elemento.

Al anadir un elemento nuevov:

v.sig := p

p := v

Listas y arboles– p. 7

Page 8: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Colas

Una cola (inglés: queue) es una estructura donde loselementos nuevos llegan al final, pero el procesamiento sehace desde el primer elemento.

También colas están fácilmente implementadas comolistas enlazadas, manteniendo un puntero al comienzo dela cola y otro al final.

Listas y arboles– p. 8

Page 9: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Ordenación de listas

Para ordenar una lista L = [ℓ1, ℓ2, . . . , ℓn] en ordencreciente, necesitamos una subrutina:

insertar(L, i, x) busca desde el comienzo laposición i en la lista L por un elemento ℓj ≤ x hacía laprimera posición, tal que j ≤ i.

Al encontrar tal elemento, el elemento x estará insertada en la

posición justo después del elemento ℓj .

Si no se encuentra un elemento así, se inserta x al comienzo dela lista.

Listas y arboles– p. 9

Page 10: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Ordenación por inserción

El procedimiento de la ordenación empieza con el primerelemento de la lista y progresa con una variable indicadorade posición i hasta el último elemento.

Para cada elemento, quitamos ℓi de la lista y llamamos lasubrutina insertar(L, i, x) para volver a guardarlo.

Listas y arboles– p. 10

Page 11: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Guardando árboles

Un arbola de n vértices etiquetados 1, 2, . . . , n se puedeguardar en un arreglo a[] de n posiciones, donde el valorde a[i] es la etiqueta del vértice padre del vértice i.

Otra opción es guardar en cada elemento un puntero alvértice padre (y posiblemente del padre una estructura depunteros a sus hijos).

aun grafo conexo simple no cıclico

Listas y arboles– p. 11

Page 12: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Árboles son “listas estructuradas”

Árboles son como ındicesde bases de datos.

Cada elemento consiste de una clave(no necesariamenteúnico) y un dato. Árboles permiten realizar eficientemente

inserciones,eliminaciones, y

busquedas.

Es necesario que exista un orden sobre el espacio de lasclaves de los elementos.

Listas y arboles– p. 12

Page 13: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Árboles binarios

En un arbol binario , cada vértice que no es una hojatiene al máximo dos vértices hijos: su hijo izquierdo y suhijo derecho.

ramo derecho de la raız

hijo derecho

la raız

hijo izquierdo

Si ningún vértice tiene solamente un hijo, se dice que elárbol está lleno.

Listas y arboles– p. 13

Page 14: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Árboles cómó índices

Su uso como índices es relativamente fácil también parabases de datos muy grandes, como diferentes ramos ypartes del árbol se puede guardar en diferentes paginasde la memoria física de la computadora.

Listas y arboles– p. 14

Page 15: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Imbalance

El problema con árboles binarios es que su forma dependedel orden de inserción de los elementos y en el peor casopuede reducir a casi una lista.

Un arbol balanceado conn = 8 y profundidad tres.

El peor caso de falta de balance paran = 8 tiene profundidad seis.

Listas y arboles– p. 15

Page 16: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Árboles AVL

Árboles AVL (de Adel’son-Vel’skii y Landis, 1962) sonárboles binarios que aseguran complejidad asintoticaO (log n) para las operaciones básicas de índices.

La variación de árboles AVL que estudiamos acá guardatoda la informacion en sus hojasy utiliza los vértices“internos” para información utilizado al realizar lasoperaciones del índice.

Listas y arboles– p. 16

Page 17: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Vértices de ruteo

Los vértices que no son hojas son vértices de ruteo .

El orden del árbol es tal que todas las hojas en el ramo delhijo izquierdo contienen claves menoresque el valor delvértice de ruteo y todas las hojas en el ramo del hijoderecho contienen claves mayores o igualesque el valordel vértice de ruteo mismo.

Por el uso de vértices de ruteo, son siempre llenos.

Listas y arboles– p. 17

Page 18: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Búsqueda de una clave

Utilizamos en los ejemplos enteros positivos como lasclaves.

Para buscar la hoja con clavei, se empieza del raíz delárbol y progresa recursivamente al hijo izquierdo si el valordel raíz es mayor a i y al hijo derecho si el valor es menoro igual a i.

Cuando la búsqueda llega a una hoja, se evalúa si elvalor de la hoja es i o no.

Si no es i, el árbol no contiene la clave i en ninguna parte.

Listas y arboles– p. 18

Page 19: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Pseudocódigo de búsqueda

procedimiento ubicar(int clave, nodo actual) : hoja {

si (actual es una hoja) {

devuelve hoja ;

} en otro caso {

si (actual.clave <clave) {

ubicar(clave, actual.derecho);

} en otro caso {

ubicar(clave, actual.izquierdo);

}

}

}

Listas y arboles– p. 19

Page 20: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Árboles balanceados

El árbol está balanceadosi el largo máximo es k, el largomínimo tiene que ser mayor o igual a k − 1.

En este caso, el número de hojasdel árbol n es

2k ≤ n < 2k+1.

Listas y arboles– p. 20

Page 21: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Condición de balance

La condición que utilizamos para decidir si o no un dadoárbol esta balanceado es la condicion de balance AVL.

También existen otras condiciones.

Necesitamos algunas definiciones...

Listas y arboles– p. 21

Page 22: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Altura de un vértice

A(v) =

{

1, si v es una hojamax{A(izq(t)),A(der(t))}+ 1, si v es de ruteo.

La altura de un ramo de un vértice v, es decir, un subárbolla raíz de cual es v es la altura de v.

La altura del árbol entero es la altura de su raíz.

Listas y arboles– p. 22

Page 23: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Condición de balance AVL

Un árbol balanceado se puede caracterizar como un árbolcon raíz vr con A(vr) = O (log n).

La condición de balance AVL es que ∀v ∈ V

|A(izq(v))−A(der(v))| ≤ 1.

Listas y arboles– p. 23

Page 24: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Profundidad de un vértice

Para derivar unas cotas sobre la forma del árbol, definimosademás la profundidad de cada vértice del árbol:

D(v) =

{

0, si v es la raíz,D(v.P) + 1, en otro caso.

La profundidad del árbol entero es simplementemaxv D(v). Aplica que D = A− 1.

Listas y arboles– p. 24

Page 25: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Análisis asintótico

Denotamos por n el numero de vértices en total y por H elnumero de hojas del árbol. Para todo n = 2k, tenemosH = 2n− 1 y D = log2 n.

Para ubicar a una clave a profundidad d toma exactamented pasos en el árbol, es decir, tiempo O (d).

=⇒ Para cada árbol perfectamente balanceado de Hhojas, se puede localizar una clave en tiempoO (D) = O (log2H) = O (log2 n).

Para un árbol balanceado, la diferencia en el largo de loscaminos es un constante (uno) =⇒ aplica que su tiempode acceso es O (log2 n).

Listas y arboles– p. 25

Page 26: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Implicaciones del balance

La condición de balance AVL implica que para un vérticede ruteo vr con A(vr) = a es necesario que

o ambos de sus hijos tengan altura a− 1

o un hijo tiene altura a− 1 y el otro altura a− 2.

El número de vértices de ruteo en el ramo de una hoja escero.

Listas y arboles– p. 26

Page 27: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Tamaño de un ramo

El tamano del ramocon raíz en v se puede expresar entérminos de los tamaños de los ramos de sus hijos:

El número de vértices de ruteo Rv en el ramo de v es lasumadel número de vértices de ruteo en el ramo de suhijo izquierdo Rw con el número de vértices de ruteo en elramo de su hijo derecho Ru mas unopor el vértice deruteo v mismo.

Listas y arboles– p. 27

Page 28: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Ecuación recursiva

Utilizamos esta relación para escribir una ecuaciónrecursiva para llegar a una cota superior de la altura de unárbol:

Sea la altura del hijo izquierdo w exactamente a− 1 y laaltura del otro hijo vu la otra opción a− 2 (hay imbalance).

Denotamos por R(a) el número de vértices de ruteo en unramo con raíz un v en altura a.

Listas y arboles– p. 28

Page 29: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

La ecuación

Rv = Rw +Ru + 1

R(a) = R(a− 1) +R(a− 2) + 1

1 +R(a) = 1 +R(a− 1) +R(a− 2) + 1(

1 +R(a))

=(

1 +R(a− 1))

+(

1 +R(a− 2))

F(a) = F(a− 1) + F(a− 2).

La sustitución que hicimos era 1 +R(k) = F(k).

Listas y arboles– p. 29

Page 30: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Números de Fibonacci

Hemos llegado a la definición de la sucesion deFibonacci:

Fk =

0, si k = 0

1, si k = 1

Fk−1 + Fk−2, para k > 1.

Listas y arboles– p. 30

Page 31: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Cota inferior

A los números de Fibonacci aplica que

F(a) >φa

√5− 1

donde φ = 1+√

5

2es la tasa dorada.

Listas y arboles– p. 31

Page 32: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

A nuestra ecuación...

Las condiciones iniciales son:

R(0) = 0 porque no hay vértices de ruteo en ramos delas hojas, y

R(1) = 1 porque el vértice de ruteo mismo es el únicoen su ramo si sus ambos hijos son hojas.

=⇒ La ecuación aplica para R(k) donde k ≥ 2.

Listas y arboles– p. 32

Page 33: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Sustitución

La sustitución 1 +R(k) = F(k) tampoco aplica desde elcomienzo, como

F(0) = 0 < R(0) + 1 = 0 + 1 = 1

F(1) = 1 < R(1) + 1 = 1 + 1 = 2.

Sin embargo, los valores 1 y 2 también aparecen en lasucesión de Fibonacci:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, . . .

Listas y arboles– p. 33

Page 34: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Nuestra ecuación de nuevo

Podemos escribir para cada k que R(k) = F(k + 2) + 1.

R(a) = F(a+ 2)− 1 > φa+2

5− 2

R(a)− 2 = φa+2

5

logφ(R(a) + 2) = logφ

(

φa+2

5

)

logφ(R(a) + 2) = a+ 2− logφ(√5)

a ≈ 1,440 log(R(a) + 2)− 0,328.

Listas y arboles– p. 34

Page 35: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

El resultado

Ya sabemos que n > R(A) porque H > 0 — siempre hayhojas si el árbol no está completamente vacío.

Teorema: Para cada árbol que cumple con la condiciónde balance AVL, A / 1,440 log(n+ 2)− 0,328.

Listas y arboles– p. 35

Page 36: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Inserción

Para insertar un elemento nuevo al árbol de índice,primero hay que buscar la ubicación de la clave delelemento.

Llegando a la hoja vh donde debería estar la clave, hayque crear un vertice de ruteovr nuevo.

La hoja vh va a ser uno de los hijos del vértice de ruteo y elotro hijo será un vértice nuevo vn creado para el elementoque está insertado.

Listas y arboles– p. 36

Page 37: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Ejemplo

El elemento menor de vh y vn será el hijo izquierdo y elmayor el hijo derecho.

El valor del vértice de ruteo vr así creado será igual alvalor de su hijo derecho.

a

b

c

a

Listas y arboles– p. 37

Page 38: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Eliminación

Para eliminar un elemento del árbol, hay que primeroubicar su posición y después eliminar ademas de lahoja su vertice de ruteovr y mover el otro vértice hijodel vértice de ruteo vh a la posición que ocupó vr.

b c

ca

Listas y arboles– p. 38

Page 39: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Temas de los proyectos

En dos meses, deberían estar listos los proyectosindividuales.

¿Cómo les va?

Listas y arboles– p. 39

Page 40: Dra. Elisa Schaeffer · listas enlazadas, manteniendo un puntero al comienzo de la cola y otro al final. Listas y a´rboles– p. 8. Ordenación de listas Para ordenar una lista

Tarea para entregar el martes

Un grafo aleatorio uniforme Gn,m (simple, no dirigido)con n vértices y m aristas, es tal que cada una de lasposibles

(

n

2

)

aristas está elegida uniformemente al azarcon la misma probabilidad, o sea, cada conjunto de maristas tiene la misma probabilidad de ser eledigo.

¿Cómo implementarías la generación de grafos uniformesGn,m utilizando (a) arregloso (b) listas? Analiza eltiempo de accesoy el uso de memoriade ambasopciones.

Listas y arboles– p. 40