Note que todas las operaciones del árbol tienen un costo proporcional a la
operación splay que las sigue. Por lo tanto, podemos concentrarnos en el
costo de esta operación (si bien luego consideraremos la modificación que
hacen en el árbol la inserción y el borrado).
Para analizar esta operación en forma amortizada definiremos una función
potencial. Sea Si(x) el subárbol con raíz x luego de la operación i, y
sea si(x)=∣Si(x)∣ su número de nodos. Finalmente, sea ri(x)=log2si(x) el rango de x luego de la operación i. La función potencial
del árbol T, visto como un conjunto de nodos, es entonces
ϕi = x∈T∑ri(x).
Analicemos cómo cambia Δϕi luego de realizar las rotaciones.
Zig-zig y zag-zag
Los únicos nodos cuyos rangos se modifican son
los de x, y, y z. Por lo tanto,
Δϕi = (ri(x)−ri−1(x))+(ri(y)−ri−1(y))+(ri(z)−ri−1(z)).
Note también los siguientes hechos simples:
(1) ri(x)=ri−1(z); (2) ri−1(y)≥ri−1(x); (3) ri(y)≤ri(x). El costo real de hacer un zig-zig es ci=2, mientras que el costo
amortizado es
ci^ = ci+Δϕi==≤=2+(ri(x)−ri−1(x))+(ri(y)−ri−1(y))+(ri(z)−ri−1(z))2+[ri(x)−ri−1(z)]+ri(y)+ri(z)−ri−1(x)−ri−1(y)2+ri(x)+ri(z)−ri−1(x)−ri−1(x)2+ri(x)+ri(z)−2ri−1(x),
donde en la desigualdad usamos los tres hechos simples mencionados.
Vamos a usar la siguiente propiedad, que se deduce de la concavidad del
logaritmo, pero igual mostramos su deducción:
02ab4ablog2(4ab)log2(ab)log2a+log2b≤≤≤≤≤≤(a−b)2,a2+b2,(a+b)2,log2((a+b)2),2log2(a+b)−2,2log2(a+b)−2.
Usaremos esta propiedad y el hecho simple de que si−1(x)+si(z)≤si(x) para obtener lo siguiente:
ri−1(x)+ri(z)=≤log2si−1(x)+log2si(z) ≤ 2log2(si−1(x)+si(z))−22log2si(x)−2 = 2ri(x)−2.
Por lo tanto, podemos reemplazar ri(z) por 2ri(x)−ri−1(x)−2 en
nuestra ecuación de ci^ para obtener
ci^ ≤ 3(ri(x)−ri−1(x)).
Zig-zag y zag-zig
Partimos de la misma forma que antes y luego
acotamos:
ci^ = ci+Δϕi==≤2+(ri(x)−ri−1(x))+(ri(y)−ri−1(y))+(ri(z)−ri−1(z))2+[ri(x)−ri−1(z)]+ri(y)+ri(z)−ri−1(x)−ri−1(y)2+ri(y)+ri(z)−2ri−1(x),
donde en la desigualdad usamos que ri(x)=ri−1(z) y
que ri−1(y)≥ri−1(x). Ahora volvemos a usar que log2a+log2b≤2log2(a+b)−2 y que si(y)+si(z)≤si(x) para acotar
ri(y)+ri(z)=≤log2si(y)+log2si(z) ≤ 2log2(si(y)+si(z))−22log2si(x)−2 = 2ri(x)−2.
Sustituyendo en la fórmula de ci^ tenemos entonces
ci^ ≤ 2(ri(x)−ri−1(x)) ≤ 3(ri(x)−ri−1(x))
Zig y zag
En estas operaciones tenemos ci=1.
Como ri(y)≤ri−1(y) y ri(x)≥ri−1(x),
ci^=≤≤ci+(ri(x)−ri−1(x))+(ri(y)−ri−1(y))1+ri(x)−ri−1(x)1+3(ri(x)−ri−1(x)).
Splay
Una operación splay se compone de una secuencia de m rotaciones dobles
consecutivas, posiblemente terminadas por una simple, todas aplicadas sobre el
mismo nodo x. Su costo amortizado es entonces
c^ ≤ 1+i=1∑m3(ri(x)−ri−1(x)) = 1+3(rm(x)−r0(x)) ≤ 1+3log2n
donde la última desigualdad se obtiene notando que rm(x)=log2n porque
x termina siendo la raíz, y despreciando r0(x)≥0.
Operaciones del árbol
La cota de splay
implica directamente una cota amortizada de O(logn) para las
operaciones de búsqueda exitosa sobre un splay tree. Lo mismo ocurre con la
búsqueda infructuosa, la inserción
y el borrado, ya que hemos hecho que su costo sea proporcional a la operación
de splay correspondiente. La única consideración final que necesitamos es que
la inserción, al agregar un elemento x, puede incrementar el potencial
ϕ, lo cual debe ser absorbido por el costo amortizado de la inserción.
La diferencia de potencial que produce la inserción de una hoja x, siendo
y1,…,ym los nodos de su camino hacia la raíz y s(yj) sus tamaños,
son
Δϕ=≤=≤≤∑j=1m(log2(s(yj)+1)−log2s(yj))(log2(s(ym)+1)−log2s(ym))+∑j=1m−1(log2s(yj+1)−log2s(yj))log2(s(ym)+1)−log2s(ym)+log2s(ym)−log2s(y1)log2(n+1)−1log2n,
donde usamos que, como yj+1 es el padre de yj, debe valer s(yj+1)≥s(yj)+1. El incremento de potencial de la inserción es también O(logn), lo que completa el análisis.