레드-블랙 트리와 AVL 트리의 차이점


82

누군가이 두 데이터 구조의 주요 차이점이 무엇인지 설명해 주시겠습니까? 차이점 / 유사점을 강조하는 온라인 소스를 찾으려고했지만 너무 유익한 정보를 찾지 못했습니다. 어떤 경우에 하나가 다른 것보다 선호됩니까? 어떤 실제 상황이 다른 것보다 사용하기 더 좋게 만드는가?

답변:


100

AVL 나무는 빨강-검정 나무보다 더 엄격한 균형을 유지합니다. AVL 트리에서 루트에서 가장 깊은 잎까지의 경로는 최대 ~ 1.44lg (n + 2) 인 반면, 빨간색 검은 색 트리에서는 최대 ~ 2lg (n + 1)입니다.

결과적으로 AVL 트리에서 조회하는 것이 일반적으로 더 빠르지 만 더 많은 회전 작업으로 인해 삽입 및 삭제 속도가 느려집니다. 따라서 조회 수가 트리에 대한 업데이트 수를 지배 할 것으로 예상되는 경우 AVL 트리를 사용하십시오.


3
개념을 더 잘 이해하도록 요청합니다. avl 트리와 레드 블랙 트리 모두 삽입 당 최대 2 개의 회전이 있습니다. 그렇다면 AVL 트리가 느리다고 어떻게 말할 수 있습니까? 미리 감사드립니다!
user2626445

@larsmans! 성능 차이가 너무 커서 새로운 컨셉이 만들어 지나요?
Shashwat 2014 년

@Shashwat 나는 당신이 의미하는 바를 이해하지 못합니다. 새로운 개념?
Fred Foo

2
@larsmans! 삽입, 삭제 및 업데이트 성능에 약간의 차이가 있지만 AVL 트리를 사용할 때 Red-Black 트리의 개념이 왜 그렇게 유명합니까? Red-Black 트리를 AVL 트리와 다른 중요한 것이 있습니까?
Shashwat 2014 년

이를 유지하는 알고리즘이 다르기 때문에 이름이 다릅니다. AFAIK, 그들은 동일한 big-O 시간 경계로 동일한 작업 세트를 지원합니다.
Fred Foo

54

작은 데이터의 경우 :

insert : RB 트리 및 avl 트리는 최대 회전 수가 일정하지만 평균 RB 트리는 회전을 적게 사용하므로 RB 트리가 더 빠릅니다.

lookup : AVL 트리는 깊이가 적기 때문에 AVL 트리가 더 빠릅니다.

delete : RB 트리는 일정한 최대 회전 수를 가지지 만 AVL 트리는 O (log N) 회전을 최악으로 할 수 있습니다. 평균적으로 RB 트리는 회전 수가 적으므로 RB 트리가 더 빠릅니다.

대용량 데이터 :

삽입 : AVL 트리가 더 빠릅니다. 삽입하기 전에 특정 노드를 찾아야하기 때문입니다. 데이터가 많을수록 특정 노드를 찾는 시간 차이가 O (log N)에 비례하여 증가합니다. 그러나 AVL 트리 및 RB 트리는 최악의 경우에도 일정한 회전 수만 필요합니다. 따라서 병목은 특정 노드를 찾는 시간이됩니다.

조회 : AVL 트리가 더 빠릅니다. (작은 데이터의 경우와 동일)

delete : AVL 트리는 평균적으로 더 빠르지 만 최악의 경우 RB 트리가 더 빠릅니다. 제거하기 전에 교체 할 매우 깊은 노드를 찾아야하기 때문입니다 (삽입 이유와 유사). 평균적으로 두 나무는 일정한 회전 수를 가지고 있습니다. 그러나 RB 트리에는 회전에 대한 상수 상한이 있습니다.


2
이것은 AVL 트리가 많은 양의 데이터에서 거의 항상 선호된다는 것을 의미하는 것 같습니다. Java 및 C ++ STL에서 어떻게 사용됩니까? stackoverflow.com/questions/3901182/…
emschorsch

삽입 / 삭제 사례에서 AVL 트리를 RB 트리보다 좋게 만들려면 일정량의 데이터 (예 : 백만 개)가 필요하며 실제로 구현 방법에 따라 다릅니다. 스마트 AVL 구현은 적은 양의 데이터로도 std :: map을 능가 할 수 있습니다. 예를 들어, 학부모가> 높이보다 큰 5 인 경우 자녀와 손자가 null인지 체크 할 필요가 없습니다
DU Jiaen

이것은 훌륭한 분석이며 모든 종류의 데이터 구조 비교의 모범이되어야합니다. 허용 대답보다 더 나은
pterodragon

1
'작은 데이터'에 대한 요약을 요약하면 다음과 같습니다. AVL은 선행 작업을 더 많이 수행하고 나중에 성능을 높이기 위해 (쓰기 / 회전) 더 엄격합니다 (읽기). 읽는 것보다 더 많이 읽을 것이기 때문에 데이터가 증가함에 따라 읽기가 더 중요해집니다 (검색에 비해 회전이 중요하지 않음). 따라서 AVL은 읽기에 최적화되어 있기 때문에 모든면에서 승리합니다.
Ben Butterworth

8

이것에서 인용 : AVL과 Red-Black 나무의 차이점

RB- 트리는 AVL 트리와 마찬가지로 자체 균형을 유지합니다. 둘 다 O (log n) 조회 및 삽입 성능을 제공합니다. 차이점은 RB- 트리는 삽입 작업 당 O (1) 회전을 보장한다는 것입니다. 이것이 실제 구현에서 실제로 성능을 저하시키는 것입니다. 단순화 된 RB- 트리는 동적 노드 구조의 오버 헤드를 처리하지 않고 개념적으로 2-3 개의 트리가 됨으로써 이러한 이점을 얻습니다. 물리적으로 RB- 트리는 이진 트리로 구현되고 빨간색 / 검은 색 플래그는 2-3 개의 동작을 시뮬레이션합니다.

따라서 정의에 따라 모든 AVL은 Red-Black의 하위 집합입니다. 구조 조정이나 회전없이 모든 AVL 트리에 색상을 지정하여 Red-Black 트리로 변환 할 수 있어야합니다.


3

AVL 트리는 둘 다 동일한 작업 집합을 지원 O(log n)하고 기본 작업에 시간이 걸리기 때문에 종종 레드-블랙 트리와 비교 됩니다. 조회 집약적 인 애플리케이션의 경우 AVL 트리는보다 견고하게 균형을 이루기 때문에 레드-블랙 트리보다 빠릅니다. 빨강-검정 나무와 유사하게 AVL 나무는 높이가 균형을 이룹니다. 둘 다 일반적으로 모든 μ ≤ ½에 대해 중량 균형 또는 μ 균형이 아닙니다. 즉, 형제 노드는 매우 다른 수의 자손을 가질 수 있습니다.

AVL 트리 에 대한 Wikipedia 기사에서


3

나무의 최대 높이는 균형을 유지하는 데 가장 중요합니다. 1.44 * log(n)AVL과 거의 같지만 RB 트리의 경우 2 * log(n). 따라서 문제가 검색 인센티브 일 때 AVL을 사용하는 것이 더 낫다는 결론을 내릴 수 있습니다. 중요한 것은 AVL 및 RB 트리에 대한 또 다른 질문입니다. RB 트리는 낮은 회전 비용으로 무작위 삽입에 직면 할 때 AVL보다 낫지 만 오름차순 데이터를 삽입하는 데 좋은 AVL입니다. 따라서 문제가 삽입 인센티브 인 경우 RB 트리를 사용할 수 있습니다.


3

AVL 트리의 작동 방식에 대한 아이디어를 얻으려면 대화 형 시각화가 도움 됩니다.

AVL과 RedBlack Tree는 높이 균형이있는 트리 데이터 구조입니다. 그것들은 매우 유사하며, 실제 차이점은 추가 / 제거 작업시 수행되는 회전 작업 수로 구성됩니다. AVL의 경우 전체적으로 더 균일 한 균형을 유지하기 위해 더 높습니다.

두 구현 모두으로 확장됩니다. O(lg N)여기서 N은 잎의 수이지만 실제로 AVL 트리는 조회 집약적 인 작업에서 더 빠릅니다. 더 나은 균형을 활용하면 트리 순회가 평균적으로 더 짧습니다. 반면에 삽입 및 삭제 측면에서 AVL 트리는 더 느립니다. 수정시 데이터 구조를 적절하게 재조정하려면 더 많은 회전이 필요합니다.

범용 구현의 경우 (예 : 검색이 작업의 우세한지 명확하지 않음) RedBlack 트리가 선호됩니다. 검색된만큼 자주 데이터 구조가 수정되는 모든 경우에 구현하기 더 쉽고 일반적인 경우에 더 빠릅니다. . 예, TreeMapTreeSet배킹 RedBlack 나무의 자바 메이크업 사용.


2

RedBlack 트리의 회전 수가 적다는 사실은 삽입 / 삭제시 더 빠르게 만들 수 있지만 ..... 일반적으로 약간 더 깊기 때문에 삽입 및 삭제시 더 느릴 수도 있습니다. 트리의 한 수준에서 다음 수준으로 이동할 때마다 요청 된 정보가 캐시에없고 RAM에서 검색되어야한다는 큰 변화가 있습니다. 따라서 더 적은 회전으로 얻은 시간은 더 깊이 탐색하고 캐시를 더 자주 업데이트해야하기 때문에 이미 손실 될 수 있습니다. 캐시에서 작동 할 수 있는지 여부는 큰 차이를 만듭니다. 관련 정보가 캐시에있는 경우 추가 수준을 탐색하는 데 필요한 시간에 여러 회전 작업을 수행 할 수 있으며 다음 수준 정보는 캐시에 없습니다. 따라서 RedBlack이 이론적으로 더 빠르며 필요한 작업 만 보면 실제로는 더 느릴 수 있습니다.


1

내가 본 것에서 AVL 트리는 AVL 트리의 원하는 높이 (Log n)를 얻기 위해 필요한만큼 많은 회전 (가끔 트리를 반복적으로 위로)하는 것 같습니다. 이것은 더 견고하게 균형을 이룹니다.

레드 블랙 트리의 경우 삽입 및 제거를 통해 유지해야하는 5 가지 규칙 세트가 있습니다 . http://en.wikipedia.org/wiki/Red-black_tree에서 찾을 수 있습니다 .

빨강 검정 나무에 도움이 될 수있는 가장 중요한 것은이 다섯 가지 규칙에 따라 삼촌이 빨강이면 나무를 뿌리까지 반복적으로 채색 할 수 있다는 사실입니다. 삼촌이 검은 색이면 문제를 해결하기 위해 최대 2 번의 회전을해야하지만 1 ~ 2 번의 회전 후에는 완료됩니다. 그것을 포장하고 잘 자라고 말하십시오. 그것이 당신이해야 할 조작의 끝이기 때문입니다.

큰 규칙은 5 번입니다 ... '주어진 노드에서 하위 리프로가는 모든 간단한 경로에는 동일한 수의 검은 색 노드가 포함됩니다.'

이렇게하면 나무를 작동시키는 데 필요한 대부분의 회전이 발생하여 나무가 너무 균형을 잃지 않게됩니다.


1

요약 : AvlTrees는 RedBlackTrees보다 약간 더 균형이 잘 맞습니다. 두 트리 모두 조회, 삽입 및 삭제에 전체적으로 O (log n) 시간이 걸리지 만 삽입 및 삭제를 위해 전자는 O (log n) 회전이 필요하고 후자는 O (1) 회전 만 걸립니다.

회전은 메모리에 쓰는 것을 의미하고 메모리에 쓰는 것은 비용이 많이 들기 때문에 RedBlackTrees는 실제로 AvlTrees보다 업데이트 속도가 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.