Splay 트리와 기본 연산(zig, zig-zig, zig-zag)에 대해 소개했다.
zig-zig 연산을 할 때 x-p 회전보다 p-g 회전을 먼저 하는 것에 대한 의문을 제기했다.
p-g 연산을 먼저하면 아래와 같은 장점이 있음을 구체적인 예시를 통해 확인해보았다.
잠재함수와 관련 용어를 소개하고 구체적인 예시에서 확인해보았다.
Access Lemma
루트 노드가 root인 트리에서 노드 x를 splay 하는 분할상환비용은
3(rank(root) - 3rank(x)) + 1
이하이다.
회전 전 회전 후
----------------------------------------------------
p x'
/ \ / \
x C A' p'
/ \ / \
A B B' C'
rank(node) 는 node 자신을 포함하여 그 아래에 있는 모든 노드의 개수에 로그를 취한 값이다.
그런데 A, B, C는 zig 연산 전, 후에 아래에 달린 것?이 그대로임을 알 수 있다.
그러니까 p, g만 rank가 변한다.
따라서
(잠재함수 변화량 ΔΦ )
= rank(x') + rank(p') - rank(x) - rank(p)
= rank(p') - rank(x)
≤ rank(x') - rank(x)
이다.
왜냐면, 변화 전 후에 루트 노드의 rank는 일정하며, 트리에서 루트 노드의 rank가 가장 크기 때문이다.
회전 전 회전 후(올바른 zig-zig)
----------------------------------------------------
g x'
/ \ / \
p D A' p'
/ \ / \
x C B' g'
/ \ / \
A B C' D'
마찬가지로, 노드 x에 zig-zig 연산을 했을 때 잠재함수 변화량에 대한 부등식을 x에 대한 rank로 나타내보자.
ΔΦ
= rank(x') + rank(p') + rank(g') - rank(x) - rank(p) - rank(g)
= (rank(p') - rank(p)) + (rank(g') - rank(x))
≤ 3(rank(x') - rank(x)) - 2
이 되는데 설명이 필요할 것이다.
1) 첫번째 등식에서 g, x' 이 루트노드로 rank(g) = rank(x') 이라 상쇄되어
ΔΦ
= rank(p') + rank(g') - rank(x) - rank(p)
은 zig-zig과 비슷하므로 생략하겠다.
결과는 마찬가지로
ΔΦ ≤ 3rank(x') - 3rank(x) - 2
참고 문헌