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

Post on 13-Aug-2021

1 views 0 download

transcript

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

Contenidos

1 Splay tree

2 Link-cut tree

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

Contenidos

1 Splay tree

2 Link-cut tree

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Contenidos

1 Splay tree

2 Link-cut tree

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

¡Gracias!

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