스플레이 트리 회전 알고리즘이 부모 노드와 조부모 노드를 모두 고려하는 이유는 무엇입니까?


25

Splay Tree 데이터 구조의 회전이 평가 노드의 부모뿐만 아니라 조부모 (zig-zag 및 zig-zig 작업)를 고려하는 이유를 잘 이해하지 못합니다. 다음이 작동하지 않는 이유 :

예를 들어 트리에 새 노드를 삽입하면 왼쪽 또는 오른쪽 하위 트리에 삽입되는지 확인합니다. 왼쪽에 삽입하면 결과가 오른쪽으로 회전하고 오른쪽 하위 트리의 경우에는 반대로 회전합니다. 재귀 적으로 이것은 sth 일 것입니다

Tree insert(Tree root, Key k){
    if(k < root.key){
        root.setLeft(insert(root.getLeft(), key);
        return rotateRight(root);
    }
    //vice versa for right subtree
}

그것은 "스플레이"절차 전체를 피해야한다고 생각하지 않습니까?

답변:


30

보다 간단한 밸런싱 알고리즘은 최악의 경우 회 전당 상각 시간이 필요할 수 있습니다 . 그 나무가 바로 올바른 아이들의 균형이 맞지 않는 길이라고 가정 해 봅시다. 왼쪽 자식이있는 노드는 없습니다. 이 트리의 유일한 리프는 최대 키가있는 트리입니다. 이 단계를 루트까지 단계적으로 회전하면 회전을 사용한 결과 트리의 균형이 여전히 불균형합니다.Ω()1

회전 만하는 나쁜 예

2/2Ω()Ω()

나쁜 예는 계속

이 나쁜 예는 Sleator와 Tarjan의 원래 스플레이 트리 페이퍼에 나타납니다.

엑스엑스엑스

나쁜 예를 보여 주다

이보다 복잡한 알고리즘의 장점은 액세스 된 노드를 루트로 가져올뿐만 아니라 액세스 된 노드의 모든 조상을 루트의 거의 절반으로 이동하지만 노드에서 일정한 수의 레벨 이상으로 노드를 옮기지 않는다는 것입니다 뿌리.

영형(로그)Ω()

더 간략하게 : Splaying은 노드를 빠르게 위아래로 천천히 움직입니다.


회전 알고리즘이 정확히 동일하다고 생각합니다. 내 것이 짧고 이해하기 쉽습니다. 조부모를 보지 않고 한 번에 부모를 고려합니다. 정확히 같은 결과를 얻지 못했습니까?
Bober02 April

나는 당신이 두 개의 SPLAYING algos를 언급하고 있다고 생각합니다. 하나는 아래로, 다른 하나는 내 것이 아니라 맞습니까? 나는 나의 algo 대 상향식
플레이 링
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.