업데이트 :이 조인 작업의 부정확성에 대한 업데이트는 아래를 참조하십시오.
가능한 솔루션에 대한 대략적인 스케치는 다음과 같습니다.
무작위 균형 B + 트리 유형을 사용 하여이 문제에 대한 해결책이 있다고 생각합니다. 가두와 마찬가지로,이 나무들은 독특한 표현을 가지고 있습니다. 트레 프와 달리 일부 키를 여러 번 저장합니다. Bent et al.의 "Biased Search Trees"의 트릭을 사용하여 각 키를 가장 높은 (즉, 루트에 가장 가까운) 레벨로만 저장하는 문제를 해결할 수 있습니다.
트레 프의 각 값이 우선 순위와 연관되는 방식과 유사하게, 순서화 된 고유 값 세트에 대한 트리가 먼저 각 값을 비트 스트림과 연관시킴으로써 작성됩니다. 트리의 각 노드에는 키와 비트 스트림이 모두 있습니다. 비 리프 노드에는 또한 해당 노드에 뿌리를 둔 나무의 높이를 나타내는 자연수가 포함됩니다. 내부 노드는 0이 아닌 하위를 가질 수 있습니다. B + 나무와 마찬가지로 뿌리에서 잎까지의 자체 교차 경로는 길이가 같습니다.
모든 내부 노드 에는 하위 잎 의 가장 큰 키 k 가 (B + 트리와 같이) 포함되어 있습니다 . 또한 각 자연수 포함 I 루트 트리의 높이를 나타내는 절 과와 연관된 비트 스트림 (K) 로부터 I + 1 이후의 비트를 제. 루트로하는 트리의 모든 키 경우 V는 자사의 비트 스트림에서 같은 첫 번째 비트를 가지고, 모든 아이 V는 잎과 내가 있다 1 . 그렇지 않으면, v 의 자식 은 내부 노드이며 모두 키와 관련된 비트 스트림에서 동일한 i 번째 비트 를 갖습니다 .V케이나는V케이나는 + 1VV나는1V나는
관련 비트 스트림이있는 정렬 된 키 목록에서 트리를 만들려면 먼저 스트림의 첫 번째 비트를 기준으로 키를 연속 그룹으로 수집하십시오. 이러한 각 그룹에 대해 그룹에서 가장 큰 키의 키 및 비트 스트림을 가지고 있지만 스트림의 첫 번째 비트는 생략하는 부모를 만듭니다. 이제 새 부모에 대해 동일한 그룹화 절차를 수행하여 조부모를 만드십시오. 하나의 노드 만 남을 때까지 계속하십시오. 이것이 나무의 뿌리입니다.
다음 키 목록과 (시작) 비트 스트림은 아래의 트리로 표시됩니다. 비트 스트림 접두사에서 '.' 모든 비트를 의미합니다. 즉, 다른 키의 비트 스트림이 다르지 않다고 가정하면 처음에 0을 가진 키 A의 비트 스트림은 다른 트리와 동일한 트리를 생성합니다.
A 0...
B 00..
C 10..
D 0...
E 0011
F 1...
G 110.
H 0001
____H____
/ \
E H
| / \
__E__ G H
/ | \ | |
B C E G H
/ \ | / \ / \ |
A B C D E F G H
특정 내부 노드의 모든 하위는 비트 스트림의 첫 번째 위치에서 동일한 비트를 갖습니다. 이것을 부모의 "색상"이라고합니다. 0은 빨간색, 1은 녹색입니다. 아이는 비트 스트림의 첫 번째 비트에 따라 "맛"이 있습니다. 0은 체리이고 1은 민트입니다. 잎은 맛이 있지만 색은 없습니다. 정의상, 체리 노드는 녹색 부모를 가질 수 없으며, 민트 노드는 빨간 부모를 가질 수 없습니다.
비트 스트림의 비트가 균일 분포에서 IID라고 가정하면, 노드 의 부모 수의 PMF 는
2 1 - n ( n - 1입니다.엔21 - n
과 예상 값은(n+1)/2입니다. 모든n≥2의 경우, 이것은≤3( n - 1난 − 1)( n + 1 ) / 2n ≥ 2이므로 예상 트리 높이는O(lgn)입니다.≤ 34엔O ( lgn )
같은 높이의 나무 두 개를 결합하려면 먼저 뿌리가 같은 색인지 확인하십시오. 그렇다면 왼쪽 루트에서 가장 오른쪽 아이를 분리하고 오른쪽 루트에서 가장 왼쪽 아이를 분리 한 다음이 두 나무를 재귀 적으로 결합하십시오. 나무의 풍미가 동일하기 때문에 결과는 높이가 같거나 키가 큰 나무가됩니다 (아래 참조). 두 나무를 재귀 적으로 결합한 결과가 절단 된 두 자녀와 같은 높이를 가지면 왼쪽 뿌리의 나머지 자녀와 그 뒤의 오른쪽 뿌리의 나머지 자녀가있는 뿌리의 중간 자녀로 만듭니다. 1보다 키가 크면 왼쪽 루트의 나머지 자식과 오른쪽 루트의 나머지 자식이있는 루트의 하위 어린이를 루트의 하위 어린이로 만듭니다. 뿌리의 색이 다른 경우, 같은 맛이 있는지 확인하십시오. 그들이한다면 오른쪽 루트의 키와 비트 스트림을 가진 새로운 부모에게 첫 비트를 생략하십시오. 그렇지 않은 경우 각 루트에 이전 루트의 키 및 비트 스트림 (각 첫 번째 비트 제외)이있는 새 부모를 제공 한 다음 해당 트리에 재귀 적으로 참여하십시오.
1 / 21 / 2O ( 1 )1 / 4후속 재귀 호출은 항상 다른 색상의 나무에 있으므로 동일한 분석이 적용됩니다.
1 / 2O ( 1 )
O ( 1 )
a 01110
b 110..
c 10...
d 00000
만든 트리의 [a,b]
높이는 2이고, 만든 트리의 [c,d]
높이는 2이며, 만든 트리의 joinEqual (tree [a,b]) (tree [c,d])
높이는 3입니다. 그러나 만든 트리의 [a,b,c,d]
높이는 5입니다.
이 오류를 찾는 데 사용한 코드는 다음과 같습니다 .