+ All Categories
Home > Documents > Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda...

Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda...

Date post: 13-Aug-2021
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
76
Splay tree + Link-cut tree Matías Hunicken 1 1 Universidad Nacional de Córdoba - FaMAF Training Camp 2020 Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 1 / 47
Transcript
Page 1: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree + Link-cut tree

Matías Hunicken1

1Universidad Nacional de Córdoba - FaMAF

Training Camp 2020

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 1 / 47

Page 2: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Contenidos

1 Splay tree

2 Link-cut tree

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 2 / 47

Page 3: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Contenidos

1 Splay tree

2 Link-cut tree

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 3 / 47

Page 4: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - intro

Splay tree es un árbol binario de búsqueda eficiente.La operación base de splay-tree es splay(x), donde x es unnodo.splay(x) lleva el nodo x a la raíz del árbol, manteniendo elorden de los nodos.Splay está basada en rotaciones simples, que suben al nodo unnivel.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 4 / 47

Page 5: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Rotaciones ( rotate(x) )

Derechay

x

A B

C−→

x

Ay

B C

Izquierday

Ax

B C

−→

x

y

A B

C

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 5 / 47

Page 6: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay

splay(x) levanta a x de abajo hacia arriba, de la siguiente forma:

Mientras x no sea la raíz:

Sea p el padre de x.Si p es la raíz, rotar x.Si no:

Si p y x son ambos hijos izquierdos o ambos hijos derechos de susrespectivos padres (zig-zig), rotar p y luego rotar x.Caso contrario (zig-zag), rotar x dos veces.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 6 / 47

Page 7: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay - zig-zig

z

y

x

A B

C

D −→

y

x

A B

z

C D

−→

x

Ay

Bz

C D

(Levanto al padre de x, luego a x)

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 7 / 47

Page 8: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay - zig-zag

z

y

Ax

B C

D −→

z

x

y

A B

C

D −→

x

y

A B

z

C D

(Levanto a x dos veces)

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 8 / 47

Page 9: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Ejemplo

splay(x)g

b

a c

e

d f

x

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 9 / 47

Page 10: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Ejemplo

splay(x)g

b

a c

x

e

d

f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 9 / 47

Page 11: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Ejemplo

splay(x)g

x

c

b

a

e

d

f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 9 / 47

Page 12: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Ejemplo

splay(x)x

c

b

a

e

d

g

f i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 9 / 47

Page 13: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay - Complejidad

El peor caso de splay es O(n) (donde n es el tamaño del árbol).Sin embargo splay es O(log(n)) amortizado (o sea, el costo de msplays es O(m · log(n))).Usando splay, se pueden implementar las típicas operaciones deárbol binario de búsqueda.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 10 / 47

Page 14: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Búsqueda

La búsqueda se hace como en cualquier árbol binario de búsqueda,pero se debe hacer splay del último nodo visitado para garantizarbuena complejidad amortizada.

search(5)(también search(4) o search(6))

9

3

2 7

5 8

11

−→

5

3

2

9

7

8

11

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 11 / 47

Page 15: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Split

split(v) consiste en dividir el árbol en dos árboles, tal que unocontiene todos los valores menores que v y el otro los mayores oiguales.Se puede implementar haciendo search(v) y borrando la aristade la raíz a su hijo izquierdo o derecho dependiendo de si el valoren la raíz es ≥ v o < v respectivamente.

split(6)

9

3

2 7

5 8

11

−→

5

3

2

9

7

8

11

−→

5

3

2

9

7

8

11

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 12 / 47

Page 16: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Merge

Merge es la inversa de split: Toma dos árboles, tal que los valoresdel primero son menores que los del segundo, y los combina enun sólo árbol.Se puede implementando haciendo splay del nodo más grandedel primero, y asignándole como hijo derecho la raíz del segundo.

2

3

7

6

10

8 11

−→

7

3

2 6

10

8 11

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 13 / 47

Page 17: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Inserción y borrado

Inserción y borrado se pueden implementar sencillamente consplit y merge.Insertar v :

Hacer split(v) en el árbol, obteniendo dos árboles T1 y T2.Si v no es la raíz de T2, crear un nuevo árbol haciendo merge deT1, un árbol con un sólo nodo de valor v , y T2.Caso contrario, hacer merge de T1 y T2.

Borrar v :Hacer split(v) en el árbol, obteniendo dos árboles T1 y T2.Si v es la raíz de T2, crear un nuevo árbol haciendo merge de T1 yel hijo derecho de T2.Caso contrario, hacer merge de T1 y T2.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 14 / 47

Page 18: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Listas

Splay tree se puede usar para representar listas, en lugar deconjuntos (un árbol representa la lista que resulta al recorrer elárbol in-order ).

5 6 9 1 9

1

6

5 9

9

En este caso:Búsqueda se puede ver como llevar un elemento de la lista a la raízdel árbol.Split se puede ver como: Dado un elemento en una lista, partir lalista en los elementos anteriores y posteriores a ese elemento.Merge se puede ver como: Dadas dos listas, concatenarlas.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 15 / 47

Page 19: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Cantidad de descendientes

Una extensión útil de splay tree es mantener para cada nodo lacantidad de “descendientes”:

Cuando rotamos un nodo, actualizamos los valores de todos losnodos en el camino de la raíz al nodo.Cuando agregamos o quitamos una arista de la raíz a un nodo,actualizamos el valor de la raíz.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 16 / 47

Page 20: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Cantidad de descendientes - ejemplo

splay(x)

g ; 11

b ; 7

a ; 1 c ; 5

e ; 4

d ; 1 f ; 2

x ; 1

i ; 3

h ; 1 j ; 1

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 17 / 47

Page 21: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Cantidad de descendientes - ejemplo

splay(x)

g ; 11

b ; 7

a ; 1 c ; 5

x ; 4

e ; 2

d ; 1

f ; 1

i ; 3

h ; 1 j ; 1

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 17 / 47

Page 22: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Cantidad de descendientes - ejemplo

splay(x)

g ; 11

x ; 7

c ; 5

b ; 2

a ; 1

e ; 2

d ; 1

f ; 1

i ; 3

h ; 1 j ; 1

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 17 / 47

Page 23: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Cantidad de descendientes - ejemplo

splay(x)

x ; 11

c ; 5

b ; 2

a ; 1

e ; 2

d ; 1

g ; 5

f ; 1 i ; 3

h ; 1 j ; 1

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 17 / 47

Page 24: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Buscar i-ésimo

Usando la cantidad de descendientes de cada subárbol, se puedeimplementar la operación de buscar el i-ésimo nodo en un árbol T deforma recursiva:

Dado un árbol T y un índice i ∈ [0, |T |).Si i = |left(T )|, retornar T .Si i < |left(T )|, buscar el i-ésimo elemento en left(T ).Si i > |left(T )|, buscar el (i − |left(T )| − 1)-ésimo elemento enright(T ).

(Nota: cada vez que hacemos esta operación debemos hacer splaydel nodo resultado).

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 18 / 47

Page 25: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Agregación

Así como mantenemos la cantidad de nodos de un subárbol,también se puede mantener el resultado de una operaciónasociativa realizada en los elementos del subárbol.De esta manera se puede utilizar splay tree como un segmenttree, donde adicionalmente soportamos las operaciones de partiry concatenar.

Para hacer update de un nodo, primero debemos hacer splay delnodo, para garantizar complejidad amortizada.Para hacer query de un rango, hacemos dos splits para quedarnoscon ese rango y devolvemos el valor guardado en la raíz.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 19 / 47

Page 26: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - Lazy propagation

Splay tree permite realizar ciertas operaciones sobre todos losvalores mediante lazy propagation.Esta técnica consiste en guardar la operación a realizarse en laraíz del árbol inicialmente, y sólo “propagarla” a los hijos en casode ser necesario, es decir:

Cuando hacemos splay de un nodo, propagamos los valores de losancestros del nodo.Cuando agregamos o quitamos una arista de la raíz, propagamosel valor de la raíz antes.

Ejemplo: Mantener mínimo del árbol y sumar un valor a todos losvalores del árbol:

Mantenemos para cada nodo un valor add, que es cuánto faltasumar a todos los descendientes del nodo.Cuando propagamos, sumamos add al valor del mínimo,sumamos add a los valores de add de los hijos y seteamos add a0.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 20 / 47

Page 27: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - reverse

Hay una operación lazy que es de especial interés, que es “darvuelta” la lista representada por el árbol.

En este caso, guardamos para cada nodo un booleano rev querepresenta si debemos dar vuelta el intervalo correspondiente.Cuando propagamos, si rev es falso no hacemos nada. Si esverdadero, swapeamos los hijos izquierdo y derecho del nodo einvertimos los valores de rev de ambos.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 21 / 47

Page 28: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

b

a c

e

d f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 29: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

b

a c

e

d f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 30: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

b

a c

e

d f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 31: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

b

a c

e

d f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 32: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

b

a c

e

d f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 33: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

b

a d

c e

f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 34: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

i

h j

b

a d

c e

f

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 35: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

i

h j

b

d

c e

f

a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 36: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

i

h j

b

d

e

f

c

a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 37: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

g

i

h j

e

f

b

c a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 38: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

g

i

h j

e

f

b

c a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 39: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

g

i

h j

e

f

b

c a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 40: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

g

i

h j

e

f

b

c a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 41: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

g

i

h j

e

f

b

c a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 42: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

g

i

h j

e

f

b

c a

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 43: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

b

c a

g

i

h j

e

f

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 44: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

d

b

c a

g

e

f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 45: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

d

b

c a

e

f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 46: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Lazy - ejemplo

reverse()splay(d)reverse()splay(g)

g

d

b

c a

e

f

i

h j

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 22 / 47

Page 47: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Splay tree - conclusión

Splay tree puede ser utilizado como un árbol binario de búsquedaextendido, o como un segment tree con operaciones de cortar,concatenar y dar vuelta.Hay otros árboles binarios de búsqueda que permiten las mismasoperaciones, como Treap, que es más sencillo de implementar ysoporta persistencia.Sin embargo, Splay tree funciona mejor que otros como basepara implementar Link-cut tree.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 23 / 47

Page 48: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Contenidos

1 Splay tree

2 Link-cut tree

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 24 / 47

Page 49: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Definición

Link-cut tree es una estructura que mantiene un bosque de árbolescon raíz. Soporta las siguientes operaciones en O(log(n)) amortizado:

link(X,Y): Conectar los nodos X e Y, haciendo a X hijo de Y (Xe Y deben estar en distintos árboles y X debe ser raíz de suárbol).cut(X): Desconectar a X de su padre.makeRoot(X): Hacer a X la raíz de su árbol.getRoot(X): Devolver la raíz del árbol de X.lca(X,Y): Dado que X e Y están en el mismo árbol, devolver elancestro común más bajo de X e Y.lift(X,k): Devolver el k-ésimo ancestro de X (lift(X,1) esel padre de X, lift(X,2) el abuelo, etc.).

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 25 / 47

Page 50: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Definición (cont.)

Además, si cada nodo tiene asociado un valor, se puede soportar:

aggregate(X,Y): Devolver el resultado de una operaciónasociativa en los nodos del camino de X a Y.update(X,v): Cambiar a v el valor asociado a X.Operaciones lazy sobre los valores de un camino (del mismo tipoque las operaciones de segment-tree).

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 26 / 47

Page 51: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - “Acceder” e hijos preferidos

La operación básica de Link-cut tree es “acceder” a un nodo, locuál se hace cada vez que hacemos una operación sobre esenodo.Llamamos a esta operación access(x).

Hijo preferido - definiciónPara cada nodo x, definimos como “hijo preferido” de x, al hijo de x encuyo subárbol fue el último acceso entre los descendientes de x (oninguno si el último acceso en el subárbol de x fue a x).

Asimismo, llamamos “arista preferida” a la arista de un nodo a su hijopreferido.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 27 / 47

Page 52: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Acceder e hijos preferidos - ejemplo

a

b c

e f

g

i j k

h

l

d

access(h)−−−−−−→

a

b c

e f

g

i j k

h

l

d

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 28 / 47

Page 53: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Representación

Las aristas preferidas particionan los nodos en caminosdescendientes, que llamamos “caminos preferidos”.La operación access(x) convierte al camino entre x y la raíz enun camino preferido.

La idea de Link-cut tree es representar cada camino preferido conun splay tree.Además, mantenemos en la raíz de cada splay tree un puntero alpadre del nodo más alto del camino preferido (llamamos a esenodo “padre del camino”).

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 29 / 47

Page 54: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Representación (ejemplo)

Árbol representado: Árbol auxiliar (lo que guardamos):

a

b

e

c

f g

h

j k l

i

m

n

d

c

f a

b

e

d

h

k g

m

i n

j l

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 30 / 47

Page 55: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access

Con esta representación, podemos implementar access(x) de lasiguiente manera:

Para hacer que x no tenga más hijo preferido, hacemossplay(x) y desconectamos a x de su hijo derecho en el splaytree, asignando x al “puntero a padre del camino” de su hijoderecho.

...

...

x

... ...

−→

...

x

A B

−→

...

x

A B

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 31 / 47

Page 56: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (cont.)

(Mantenemos el invariante de que x es raíz de su splay tree).Iteramos mientras x tenga un puntero a “padre del camino de x”(lo llamamos y).

Hacemos splay(y), llevando a y a la raíz de su splay tree.Para hacer que el hijo preferido de y deje de serlo, desconectamosa y de su hijo derecho en el splay tree, en su lugar asignando y al“puntero a padre de camino” del hijo derecho de y.Concatenamos los splay trees de x e y, haciendo hijo derecho de ya x.Rotamos x para mantener el invariante.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 32 / 47

Page 57: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (cont.)

splay(y)Cambiar hijopreferido de y rotate(x)

...

...

y

...x

C

...

−→

...

y

Ax

C

B

−→

...

y

Ax

C

B

−→

...

x

y

A B C

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 33 / 47

Page 58: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (ejemplo)

access(j)

a

b

e

c

f g

h i

j

k

d

c

a

b

e

d

f h

g

k

j

i

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 34 / 47

Page 59: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (ejemplo)

access(j)

a

b

e

c

f g

h i

j

k

d

c

a

b

e

d

f h

g

j

i k

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 34 / 47

Page 60: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (ejemplo)

access(j)

a

b

e

c

f g

h i

j

k

d

c

a

b

e

d

f h

g

j

i k

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 34 / 47

Page 61: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (ejemplo)

access(j)

a

b

e

c

f g

h i

j

k

d

g

c

a

b

e

d

f

h j

i k

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 34 / 47

Page 62: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (ejemplo)

access(j)

a

b

e

c

f g

h i

j

k

d

g

c

a

b

e

d

f

h j

i k

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 34 / 47

Page 63: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - Access (ejemplo)

access(j)

a

b

e

c

f g

h i

j

k

d

j

g

c

a

b

e

d

f

h i

k

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 34 / 47

Page 64: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Access - complejidad

Aunque no lo parezca, la cantidad de cambios de arista preferidaa no preferida y viceversa es O(log(n)) por acceso (amortizado).Esto prueba una cota superior de O(log2(n)) amortizado poracceso.Usando propiedades de splay trees, se puede demostrar que lacomplejidad amortizada es en realidad O(log(n)).Las operaciones de link-cut tree se pueden implementarfácilmente usando access, y su complejidad también resultaO(log(n)) amortizado.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 35 / 47

Page 65: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - cut(x)

cut(x) corta la arista de x a su padre:

Hacer access(x)Eliminar la arista de x a su hijo izquierdo en el splay tree.

b

c d

x

e

−→

b

c d

x

e

x

b

c d

e −→

x

b

c d

e

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 36 / 47

Page 66: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - link(x,y)

link(x,y) hace a x hijo de y (x debe ser raíz de su árbol):

Hacer access(x) y access(y)Hacer a y hijo izquierdo de x en el splay tree de x.

b

c y

x

e

−→

b

c y

x

e

x

y

b

c

e

−→

x

y

b

c

e

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 37 / 47

Page 67: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - makeRoot(x)

makeRoot(x) transorma a x en la raíz de su árbol (representado):

Hacer access(x).Hacer reverse lazy del splay tree de x.

a

b c

e f

g

h i j

x

k

d

−→

a

b c

e f

g

h i j

x

k

d

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 38 / 47

Page 68: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - getRoot(x)

getRoot(x) devuelve la raíz del árbol de x:

Hacer access(x).Encontrar el primer elemento del splay tree de x, moviéndose a laizquierda mientras pueda.Hacer splay del elemento (para garantizar complejidadamortizada) y devolverlo.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 39 / 47

Page 69: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - lca(x,y)

lca(x,y) devuelve el ancestro común más bajo de x e y (en el árbolrepresentado).

Hacer access(x) y luego access(y).Si al hacer access(y) no hubo ninguna iteración de “cambiarhijo preferido”, es porque y es ancesstro de x. Devolver y.Si no, devolver el último nodo al cuál se le cambió el hijo preferidoal hacer access(y).

a

b

d

e f y

x

g

c

−→

a

b

d

e f y

x

g

c

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 40 / 47

Page 70: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - depth(x)

depth(x) devuelve la profundidad de x (en el árbol representado).

Hacer access(x).Asumiendo que fuimos manteniendo la cantidad dedescendientes en cada nodo de splay tree, el valor para xcontiene la cantidad de nodos entre x y la raíz del árbolrepresentado (inclusive).Esa cantidad menos 1 es la profundidad de x.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 41 / 47

Page 71: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - lift(x,k)

lift(x,k) devuelve el k-ésimo ancestro de x.

Hacer access(x).Sea i=depth(x)-k.Devolver el i-ésimo elemento del splay tree visto como lista (anteshacer splay sobre el mismo para garantizar complejidadamortizada).

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 42 / 47

Page 72: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - aggregate, update y lazy

Link-cut tree permite hacer operaciones sobre caminos de unárbol de forma similar a como segment tree permite haceroperaciones sobre segmentos.Para eso, implementamos las operaciones en el splay tree, comoexplicamos antes.Para hacer update(x), simplemente hacemos access(x) yactualizamos el valor y la agregación en x.Para hacer aggregate(x,y) o lazy(x,y):

Hacemos makeRoot(x) y expose(y) para tener un splay treecon el camino de interés.Luego realizamos la operación sobre ese splay tree.Opcionalmente (si nos importa mantener las raíces originales)hacemos z=getRoot(x) antes y makeRoot(z) después.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 43 / 47

Page 73: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Link-cut tree - aggregate, update y lazy (sobre aristas)

Si queremos mantener valores en las aristas y realizar operacionessobre las aristas de un camino (en lugar de los nodos):

Creamos un nodo adicional para cada arista, y guardamos elvalor ahí (este nodo tiene dos vecinos que son los extremos de laarista “real”).En los “nodos que representan nodos” guardamos un valor neutro.Cuando hacemos link o cut, necesitamos hacer un link o cutadicional (respectivamente).

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 44 / 47

Page 74: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Más recursos

Implementación compacta de link-cut tree1: https://github.com/mhunicken/icpc-team-notebook-el-vasito/blob/master/data_structures/linkcut2.cpp

Algunos problemas para testear link-cut tree:https://www.spoj.com/problems/DYNACON1/https://www.spoj.com/problems/DYNALCA/https://codeforces.com/gym/102059/problem/A

Extensión de link-cut tree para hacer queries sobre sub-árboles:https://codeforces.com/blog/entry/67637

Notas de la clase sobre link-cut tree del MIT (para quien leinterese el análisis de la complejidad): https://courses.csail.mit.edu/6.851/spring12/scribe/L19.pdf

1Recomiendo de todos modos intentar hacer una implementación propia paraentender bien la estructura

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 45 / 47

Page 75: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

Temas relacionados

Euler-tour tree: Es otra representación de árboles (más sencilla)que conviene para hacer queries sobre subárboles (pero nosoporta queries sobre caminos).Heavy-light decomposition: Permite hacer queries y updatessobre caminos de subárboles (lo mismo que link-cut tree pero sinmodificar la estructura del árbol). Es bueno saberlo porque laimplementación es más sencilla y corta.Treap: Árbol binario de búsqueda randomizado. Por lo generalmás sencillo de usar que splay tree, y soporta persistencia muyfácilmente.

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 46 / 47

Page 76: Splay tree + Link-cut tree · 2021. 7. 14. · Splay tree es un árbol binario de búsqueda eficiente. La operación base de splay-tree es splay(x), donde x es un nodo. splay(x)

¡Gracias!

Matías Hunicken (FaMAF) Splay tree + Link-cut tree Training Camp 2020 47 / 47


Recommended