두 개의 이진 검색 트리 병합


17

임의의 크기와 범위의 두 개의 이진 검색 트리를 병합하는 알고리즘을 찾고 있습니다. 분명 나는이 구현에 대한 갈 것이라고 방법은 그 범위가 다른 나무에 임의의 외부 노드에 들어갈 수있는 전체 하위 트리를 찾을 수있을 것이다. 그러나 알고리즘이 유형의 시간을 실행하는 최악의 경우의 순서 것으로 보인다 및 각각 각 나무의 크기입니다.O(n+m)nm

그러나 나는 이것을 할 수 있다고 들었습니다 . 높이가 큰 나무의 높이는 O(h)어디 h입니까? 그리고 이것이 어떻게 가능한지 완전히 잃어 버렸습니다. 나무를 먼저 회전시키는 실험을 시도했지만 나무를 척추로 회전시키는 것은 이미 O (h)입니다.


나도 같은 질문이있는 에릭을 모른다.

공평하게, 이것은 알고리즘 숙제에서 주어진 질문이었습니다. 질문이 더 필요한 정보를 제공하는 것을 잊었 기 때문에 O (h)는 런타임에 너무 엄격하다는 것이 밝혀졌습니다 . 한 트리의 모든 키가 오른쪽 트리의 모든 키보다 작습니다.
efritz

O(log n)간단한 이동 노드 기능으로 이진 트리를 병합하지 않는 것이 있습니까?
AT

@AT 예, 그러나 우리는 한 BST의 키가 다른 BST의 키와 상호 배타적이라는 것을 몰랐습니다.
efritz

1
이것은 BST가 아닌 빨강 검정 나무입니다. 빨간색 검은 색 (AVL 트리 및 힙)은 높이 바인딩 속성을 유지하는 특수한 종류의 나무입니다. 바닐라 BST는 단일 척추 일 수 있습니다. 증가하지 않거나 증가하지 않는 일련의 숫자를 BST에 삽입하면 이러한 나무의 높이가 실제로임을 알 수 있습니다 n. 전체 또는 완전한 이진 트리 만 전체 노드 수에 대한 높이 로그를 갖습니다.
efritz

답변:


24

에서는 ArXiv : 1002.4248 존 Iacono 및 오즈 오즈 칸이 병합 개의 이진 탐색 트리 비교적 간단한 알고리즘 설명 상각 시간; 분석은 어려운 부분입니다. [ 업데이트 : Joe가 자신의 답변에서 올바르게 관찰 한 것처럼이 알고리즘은 Brown과 Tarjan 때문입니다.] 또한 바이어스 된 건너 뛰기 목록을 기반으로 O ( log n ) 상각 시간의 병합을 지원하는보다 복잡한 사전 데이터 구조를 설명합니다 .O(log2n) O(logn)

반면에 최악의 경우 는 불가능합니다. n 개의 노드가있는 2 개의 이진 검색 트리를 고려하십시오 . 하나는 22 n 사이의 짝수 정수를 저장하고 다른 하나는 12 n - 1 Ω 사이의 홀수 정수를 저장합니다O(logn)n22n12n1 . 두 트리를 병합하면 에서 2 n 사이의 모든 정수를 저장하는 새로운 이진 검색 트리가 만들어집니다 . 그러한 트리에서 노드의 일정한 비율은 부모와 다른 패리티를 갖습니다. (증거 : 홀수 리프의 부모는 짝수 여야합니다.) 따라서 짝수 트리와 홀수 트리를 병합하려면 변경해야합니다.12n 포인터.Ω(n)


한 가지 참고 사항 :이 백서의 설명을 올바르게 읽은 경우이 나무는 삽입 및 삭제를 지원하지 않습니다. 병합은 (조의 대답에 설명) 손가락 검색 트리를 병합하는 절차를 따른다. 제한된 작업 세트는 O ( n lg m 보다 더 나은 분석을 가능하게합니다.영형(lg2)하나. 영형(lg미디엄)
jbapple

1
개선 된 분석은 허용 된 작업의 제한이 아니라 할부 상환 때문입니다. 삽입 및 삭제는 동일한 상각 된 시간 범위 에서 분할 및 병합 (실제로는 "결합")을 통해 지원 될 수 있습니다 . 영형(영형)
Jeffε

호기심에서, 나무가 링크리스트 대신 배열에 저장되면 시간이 영향을 받 습니까 ( "변경점 ... 포인터 " 라고 말할 때의 의미입니다 )? Ω()
mtahmed

기본적으로 "이진 검색 트리"는 포인터 기반 구조 ( "연결된 목록"이 아님)입니다. 각 노드는 두 자녀와 부모를 가리 킵니다. 그러나 하한은 정확한 표현에 의존하지 않습니다. 있다 두 개의n-노드 이진 검색 트리를 병합하는 방법이므로 모든 비교 기반 알고리즘은 최소한log2 ( 2n(2nn)n비교하여 올바른 것을 선택하십시오. log2(2nn)2nO(logn)
Jeffε

1
@ Jɛ ff E : 분할 및 조인이 지원된다는 데 동의하지만 나무를 만들거나 파괴하는 것은 아닙니다. 예를 들어 알파벳에서 "x"를 삭제하려면 "a..wyz"뿐만 아니라 "x"도 얻습니다. 유니버스의 크기 ( , 섹션 2.1 참조)는 변경되지 않습니다. 또한 섹션 1 소개에서는 집합이 유니버스를 분할해야한다고 설명합니다.이 유니버스는 유니버스의 각 요소가 일부 트리에 있음을 의미하는 것으로 해석합니다. 제가 읽은 방식으로이 구성은 무한한 우주에서는 작동하지 않습니다. 위의 의견을 어떻게 작성해야합니까? n
jbapple

9

이 참조가 도움이 될 수 있습니다. Brown and Tarjan, A Fast Merging Algorithm . 저자는 균형 이진 (AVL) 트리를 O ( n log m )로 병합하는 방법을 보여줍니다.은 최적입니다 (비교 기반 알고리즘의 경우). mn은 이진 검색 트리로 표시되는 정렬 된 목록의 길이이며mn이라고 가정합니다.O(nlogmn)mnmn

또한 손가락 검색 트리 에 대한이 문서의 11.5 절에서 순서 집합을 병합하기위한 다양한 기술에 대한 설명을 볼 수 있습니다.


2
둘 다 시한과 일치하는 하한은mn이라고 가정합니다. 영형(로그미디엄)미디엄
Jeffε

나는 그것이 시한에 의해 암시되었다고 생각했지만, 그것을 명확하게하기 위해 질문을 편집했습니다.
Joe

0

O(1)여전히 지원하면서 O ( 1 ) 최악의 시간에 트리를 병합 할 수 있습니다 : O 에서 삽입, 삭제 및 검색 ( l o g n.O(log n)

Brodal, Gerth Stølting, Christos Makris 및 Kostas Tsichlas. '순전히 기능상 최악의 상수 시간 정렬 가능 정렬 목록' . 연례 유럽 심포지엄에 관한 제 14 차 총회 – 14 권, 172–183. ESA'06. 런던, 영국, 영국 : Springer-Verlag, 2006. [ PDF ]


1
이들의 데이터 구조는 병합이 아닌 O (1) 상각 시간 조인 을 지원합니다 . 한 트리의 모든 요소는 다른 트리의 모든 요소보다 작아야합니다.
Jeffε

아, 맞아 기사 다시 읽어했다 : "(가입 , T의 J를 ) 한 트리에서 두 그루의 나무를 결합 나무. T IT의 j는 의 모든 요소한다는 의미에서 정렬 T의 j는 작은 나보다 하나 작거나 큰 가장 큰 요소 T I . 일반성의 손실없이 가정 즉 w ( T I ) = w ( T J ) .이 경우, 트리 T의 J는 트리에 연결된 T ,이 연산의 결과는 트리이며TiTjTiTjTjTiw(Ti)=w(Tj)TjTi T i 의 척추에있는 노드에 연결됩니다. "TiTjTi
AT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.