빨간색과 검은 색 나무의 하위 범위


14

도서관에서 버그를 고치려고 노력하는 동안 나는 성공하지 못한 붉은 나무와 검은 나무에서 하위 범위를 찾는 논문을 검색했습니다. 나는 지퍼를 사용하는 솔루션과 불변의 데이터 구조에 대한 삭제 알고리즘에 사용되는 일반적인 추가 작업 과 비슷한 것을 고려하고 있지만 여전히 찾을 수 없었던 더 나은 접근 방법이 있는지 또는 최소한의 복잡도 경계가 있는지 궁금합니다. 그런 작업에?

명확히하기 위해, 나는 빨강 & 검정 나무와 두 개의 경계가 주어지면 그 경계 안에 속하는 첫 번째 나무의 모든 요소를 ​​가진 새로운 빨강 & 검정 나무를 생성하는 알고리즘에 대해 이야기하고 있습니다.

물론 복잡성의 상한은 요소를 추가하여 한 트리를 통과하고 다른 트리를 구성하는 복잡성입니다.


3
@Radu : 댓글 편집 기능에 버그가 있습니다. 주석에 라텍스를 사용하고 주석을 편집하면 복제 등과 같은 이상한 동작이 나타납니다.
Aryabhata

@Radu 나는 내 질문을 더 잘 설명하기 위해 두 개의 단락을 추가했습니다.
Daniel C. Sobral

나무는 불변인가?
이토 쓰요시

또한 마지막 단락에서 하한 대신 상한을 의미 했습니까?
이토 쓰요시

2
레드 블랙 트리에서 분할 작업은 최악의 시간 O (log n)에서 구현 될 수있는 것으로 보입니다. 여기서 n은 트리의 요소 수입니다. 이 주장은 Gersa Stølting Brodal, Christos Makris 및 Kostas Tsichlas, ESA 2006의“순수한 기능성 최악의 상수 시간 범주화 가능 정렬 목록”을 소개합니다. cs.au.dk/~gerth/pub/esa06trees.html . 이전 의견에서 언급했듯이 하위 범위 작업의 최악의 O (log n) 시간 구현을 허용합니다.
이토 쓰요시

답변:


10

이 답변은 내 의견 중 일부를 질문에 결합하고 확장합니다.

레드 블랙 트리의 하위 범위 작업은 최악의 경우 O (log n) 시간에 수행 할 수 있습니다. 여기서 n은 원래 트리의 요소 수입니다. 결과 트리는 원래 트리와 일부 노드를 공유하므로이 방법은 트리를 변경할 수없는 경우 (또는 트리는 변경 가능하지만 원래 트리는 더 이상 필요하지 않은 경우)에만 적합합니다.

하위 범위 작업은 두 개의 분할 작업으로 구현할 수 있습니다. 여기서 분할 연산은 레드-블랙 트리 T와 키 x를 취하여 L이 x보다 작은 T의 모든 요소와 R이 x보다 큰 T의 모든 요소로 구성되도록 두 개의 트리 L과 R을 생성합니다. 따라서 우리의 목표는 현재 최악의 O (log n) 시간에 레드 블랙 트리에서 분할 작업을 구현하는 것입니다.

O (log n) 시간에 적색 흑색 트리에서 분할 작업을 어떻게 수행합니까? 잘 알려진 방법이 있다는 것이 밝혀졌습니다. (나는 그것을 알지 못했지만, 데이터 구조의 전문가는 생각하지 않습니다.)이 고려 에 가입 L의 모든 값이 R의 모든 값보다 작도록 두 나무의 L과 R을 받아 구성된 트리를 생성하는 작업을, 모든 결합 연산은 최악의 시간 O (| r L -r R | +1) 에서 구현 될 수 있으며 , 여기서 r L 및 r RL과 R의 순위 (즉, 뿌리에서 각 잎까지의 경로에있는 검은 노드의 수)입니다. 분할 연산은 결합 연산 O (log n) 시간을 사용하여 구현 될 수 있으며, 텔레 스코핑 합계를 고려하여 총 최악의 시간은 여전히 ​​O (log n)입니다.

Tarjan의 책 [Tar83]의 섹션 4.1과 4.2는 최악의 시간 O (log n)에서 적-검정 나무에 대한 조인 및 분할 작업을 구현하는 방법을 설명합니다. 이러한 구현은 원래 트리를 파괴하지만 노드를 수정하는 대신 노드를 복사하여 변경 불가능한 기능적 구현으로 쉽게 변환 할 수 있습니다.

참고로, Objective Caml 의 Set 및 Map 모듈은 (불변의) 균형 이진 검색 트리에 대한 다른 표준 작업뿐만 아니라 분할 작업도 제공합니다. 레드-블랙 트리를 사용하지는 않지만 (왼쪽 높이와 오른쪽 높이가 최대 2만큼 다르다는 제약이있는 균형 이진 검색 트리를 사용하지만) 구현을 살펴 보는 것도 유용 할 수 있습니다. 다음은 Set 모듈의 구현입니다 .

참고 문헌

[Tar83] Robert Endre Tarjan. 데이터 구조 및 네트워크 알고리즘 . 응용 수학에서 CBMS-NSF 지역 회의 시리즈 44 권 , SIAM, 1983.


@Radu GRIGore : 그렇습니다.
Ito Tsuyoshi

@Radu GRIGore : 아니면 확실하지 않습니다. 이 분할 작업 구현은 출력 트리에 O (log n) 새 노드를 할당하지만 전체 작업은 꼬리 재귀 방식으로 구현할 수 있으며 O (1) 작업 공간 만 필요하다고 생각합니다. 이것이 맞다면 질문에 대한 답은“추가 공간”의 의미에 따라 다릅니다.
Ito Tsuyoshi

@ Radu GRIGore :이 경우 추가 공간은 O (1)이라고 생각하지만 신중하게 확인하지는 않았습니다.
Ito Tsuyoshi

@Radu GRIGore : 결과 자체를 저장하는 데 필요한 공간을 신경 쓰지 않고 작업 공간의 양을 신경 쓰는 이유를 알 수 없습니다. 복잡성 이론에서 문제는 일반적으로 결과가 무엇인지 지정하므로 결과를 저장하는 데 필요한 공간은 알고리즘에 의존하지 않습니다. 그러나 현재 문제에는 필요한 작업을 구현하는 여러 가지 방법이 있으며 일부 구현에는 다른 작업보다 결과를 저장하는 데 더 많은 공간이 필요합니다. 이 공간의 차이를 무시하면 필요한 작업 공간이 얼마나 중요한지 알 수 없습니다.
Ito Tsuyoshi

불변 트리의 문제는 변경 가능한 트리의 문제와 다릅니다. 나는 그 차이를 이해하므로 그것에 대해 물어볼 것이 없습니다. 이제 두 가지 문제 중 하나를 확대하면 두 가지 측면, 즉 기억과 시간이 있습니다. 당신은 얼마나 많은 메모리를 사용하는지 말하지 않았으며 대답이 무엇인지 나에게 분명하지 않은 것처럼 보였습니다. 나는 이것이 두 문제의 차이점을 무시한다고 생각하게 만드는 것을 보지 못했습니다.
Radu GRIGore

8

해결책은 적갈색 나무를 사용하지 않는 것입니다. 스플레이 트리 및 AVL 트리에서 분할 및 결합 코드는 매우 간단합니다. 이를 지원하는 스플레이 트리 및 AVL 트리 용 Java 코드가있는 다음 URL을 참조합니다. 다음 URL로 이동하여 Set.java (avl trees) 및 SplayTree.java (splay trees)를 확인하십시오.

ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/

--- 대니 슬레이터


5
사이트에 오신 것을 환영합니다, 대니!
Suresh Venkat

2
이것이 스칼라 레드 블랙 구현을 수정하여 미만 범위의 하위 범위를 지원하는 데 어떻게 도움이 O(n)됩니까? 나는 어떤 종류의 나무가 간단한 하위 범위 구현을 가지고 있는지 묻지 않았다. 왜냐하면 그것이 내가 가진 문제가 아니기 때문이다. 이 답변은 의도가 좋았지 만 주제에 맞지 않고 당면한 문제에 쓸모가 없습니다.
Daniel C. Sobral

6

(이것은 의견을 의미하는 것이지만 의견을 남기기에는 너무 새롭습니다.)

하위 범위를 새 트리로, 하위 트리없이 입력 트리를 다른 트리로 반환하는 "정밀"연산에 관심이있을 수도 있습니다. 알려진 방법은 레벨 링크에 의존하기 때문에 트리의 기본 표현을 제어해야합니다. 상각 된 의미에도 불구하고 더 작은 나무 의 크기에 대해 시간에 따라 로그가 정교하게 실행됩니다 (더 이상 종이에 액세스 할 수 없기 때문에 "amortized"는 iirc입니다).

K. Hoffman, K. Mehlhorn, P. Rosenstiehl 및 RE Tarjan, 레벨 링크 된 검색 트리를 사용하여 선형 시간으로 Jordan 시퀀스 정렬, Information and Control, 68 (1986), 170–-184

추신 : 위 인용문은 Seidel의 요약 문서에서 발췌 한 것입니다. 치료는 또한 절제를 지원합니다.


이 방법은 하나가 이미 두 경계에 대한 포인터 (또는 "손가락")를 가지고 있다고 가정합니다.
jbapple

3

nm[a,b]

  1. O(lgn)aa
  2. O(m)
  3. O(m)

O(m+lgn)O(n+mlgm)

o(m)Ω(lgm)klgm

세부 사항을 해결하지 못했기 때문에 추가 부기가 어떻게 운영 시간에 영향을 미치는지 잘 모르겠습니다.

O(1)Ω(lgm)


이것에 대해 생각하면에 대략적인 수를 얻을 수 있다고 생각 O(logn)합니다.이를 사용하면 임시 배열을 피할 수 있습니다.
Daniel C. Sobral

하위 트리 크기를 근본에 저장하여 개수를 O (lg n)로 구할 수 있습니다.
Radu GRIGore

...하지만 노드에 크기를 저장하면 보조 공간을 사용하지 않아야한다는 요구 사항에 위배되므로 메모리에 대한 귀하의 우려를 다루지 않습니다.
Radu GRIGore

1
진 나무는 완벽하게 (트리 자체에 추가) 만 상수 여분의 공간을 사용하여 재조정 할 수 있습니다 eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε을

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