거의 같은 크기의 가늘고 유사한 데이터 구조의 빠른 결합


16

주어 두 AVL 트리 T1T2 및 값 tr 되도록 xT1,yT2,x<tr<y , 그것이 함유하는 새로운 AVL 트리를 구성하기 쉽다 tr 하고있는 숫자 에서 T1T2 시간에서 O(1+|h(T1)h(T2)|) , 여기서,h(T) 트리의 높이이고T 긴 나무)들은 높이 저장소로 (.

이것은 적갈색 나무에서도 가능하며 다른 많은 종류의 균형 잡힌 나무도 가정합니다.

가단 또는 가파른 데이터 구조에 이것이 가능합니까? 우리가 tr 어떨까요?

Algorithmica의 treaps 페이퍼 는 에이 작업을 수행하는 방법을 보여줍니다. 예상 시간. 대략 같은 크기 (또는 루트 우선 순위)로 가늘거나 가늘고 유사한 데이터 구조에서 O (1) 예상 조인을 수행하는 방법이 있다면Kaplan & Tarjan트릭을 사용할 수 있다고 생각합니다.이중 로그 조인으로 가늘게 (또는 가늘고 유사한 데이터 구조)를 만들기 위해 척추.O(min(h(T1),h(T2)))


다음은 대략 같은 크기의 AVL 트리를 빠르게 결합하는 방법을 보여준 Haskell 코드입니다. haskell.pastebin.com/nfGV8Ffz
jbapple

h (T_1) = h (T_2)의 경우에도 (t_r 값을 포함하는) 새로운 노드의 예상 깊이가 일정 이상인 것처럼 보이기 때문에 (증거없이 ) 가능하다는 것을 의심합니다 .
Ito Tsuyoshi

이토 쓰요시 (Tsuyoshi Ito) : 다른 노드에 우선 순위를 할당하는 것과 같은 방식으로 새 노드에 우선 순위를 할당하면 동의합니다. 루트 노드보다 우선 순위가 높은 것으로 지정하면 어떻게됩니까? 그것은 우선 순위의 IID 특성을 파괴하지만, 만약 당신이 어떻게 다른 우선 순위를 변화된 것으로 표시한다면 어떻게 든 끝없는 레드-블랙 트리의 경로가 끝점에 표시 되는가? 또는 treap의 잎에만 값을 저장하고 t_r없이 조인을 수행하면 어떻게 될까요?
jbapple

n 개의 자손이있는 treap의 노드에는 i가 1 / n 인 자손이 남았습니다. 이것은 동일한 크기의 가늘어도 병합 시간이 길어질 수 있습니다. 새로운 루트를 선택하려면 루트를 탐색해야합니다. 트리의 평균 깊이는 Theta (lg n)이므로 Theta (lg n) 시간도 걸립니다. n 개의 자손이있는 가단 노드가 자식을 확률 (n 선택 i) / 2 ^ n으로 남겨두고 값이 B +-트리처럼 잎에만 저장되는 경우 어떻게해야합니까? 그런 다음 동일한 크기의 두 개를 결합하면 한 트리에서 다른 트리로 적은 수의 요소가 재분배됩니다.
jbapple

계산이 올 바르면 재분배 될 것으로 예상되는 요소의 수는 Theta (sqrt n)이며, 손가락 검색 속성과 같이 다른 모든 문제를 해결할 수 있다고 가정하면 여전히 Theta (lg n) 시간이 걸립니다. 더 엄격한 배포판을 사용하는 것은 어떻습니까?
jbapple

답변:


3

우선 순위가 무작위 인 경우 일반 Treap을 사용하여이 작업을 수행 할 수 없습니다.

내가 할 정확한 주장은 임의의 우선 순위를 가진 두 개의 동일한 크기의 treap에 대해 이러한 병합을 수행하려면 기대에 포인터를 업데이트해야한다는 것입니다.Θ(로그)

대략적인 증거 스케치는 다음과 같습니다.

작업을 수행하기 위해 변경해야 할 포인터 수를 고려하십시오. t r을 삽입하지 않고 T 1T 2를 병합 하면 쉽게 증명할 수 있습니다. 고려 올바른 척추가 S 1T 1 왼쪽 척추가 S 2T 2 . 색의 요소 S 1 빨간색과의 그 S 2 블루. 주문 S 1S 2Θ(로그)아르 자형12에스11에스22에스1에스2에스1에스2우선 순위별로. 이 순서에서 색상이 바뀔 때마다 포인터를 변경해야합니다. 두 스파인의 크기는 확률이 높은 이고 우선 순위는 임의적이므로 시퀀스의 색상 변화 수도 Θ ( log n ) 임을 알기가 어렵지 않습니다 . 따라서 병합에 대한 Θ ( log n ) 포인터 를 업데이트해야합니다 ( t r 추가하지 않음 ).Θ(로그)Θ(로그)Θ(로그)아르 자형

이제 병합을 수행하는 동안 을 추가 해도 실제로 큰 도움이되지 않습니다. 이 경우 포인터 변경 수는 다음과 같이 하한이 될 수 있습니다 . 우선 순위에 따라 S 1S 2{ t r } 를 정렬하십시오. 시퀀스에서 t r 미만의 모든 항목을 삭제 하십시오. 결과 시퀀스의 색상 변경 수는 하한입니다. 때문에 t의 R은 임의의 우선 순위를 가지며, 최종 treap에서 루트로하는 서브 트리의 예상 높이는 O ( 1 ) 에만 갖도록, O ( 1 ) 의 노드 (S) (1)아르 자형에스1에스2{아르 자형}아르 자형아르 자형영형(1)영형(1) 우리는 잃어버린, 그래서 기대에보다 낮은 우선 순위로 O ( 1 ) 우리 추가 할 때 하한의 포인터가 변경 t의 R을 .에스1에스2영형(1)아르 자형

이제는 일정한 예상 시간 병합을 가능하게하는 "가득한"데이터 구조를 얻는 방법이있을 것입니다.


그렇습니다. "가득한"데이터 구조를 찾고 있습니다. 나는 의견과 쓸데없는 답변에서 많이 언급했지만 제목이나 질문에 넣지 않았습니다.
jbapple

답변 주셔서 감사합니다. 모호하지 않도록 질문의 제목과 텍스트를 변경했습니다.
jbapple

1

업데이트 :이 조인 작업의 부정확성에 대한 업데이트는 아래를 참조하십시오.

가능한 솔루션에 대한 대략적인 스케치는 다음과 같습니다.

무작위 균형 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+1)/2입니다. 모든n2의 경우, 이것은3(1나는1)(+1)/22이므로 예상 트리 높이는O(lgn)입니다.4영형(lg)

같은 높이의 나무 두 개를 결합하려면 먼저 뿌리가 같은 색인지 확인하십시오. 그렇다면 왼쪽 루트에서 가장 오른쪽 아이를 분리하고 오른쪽 루트에서 가장 왼쪽 아이를 분리 한 다음이 두 나무를 재귀 적으로 결합하십시오. 나무의 풍미가 동일하기 때문에 결과는 높이가 같거나 키가 큰 나무가됩니다 (아래 참조). 두 나무를 재귀 적으로 결합한 결과가 절단 된 두 자녀와 같은 높이를 가지면 왼쪽 뿌리의 나머지 자녀와 그 뒤의 오른쪽 뿌리의 나머지 자녀가있는 뿌리의 중간 자녀로 만듭니다. 1보다 키가 크면 왼쪽 루트의 나머지 자식과 오른쪽 루트의 나머지 자식이있는 루트의 하위 어린이를 루트의 하위 어린이로 만듭니다. 뿌리의 색이 다른 경우, 같은 맛이 있는지 확인하십시오. 그들이한다면 오른쪽 루트의 키와 비트 스트림을 가진 새로운 부모에게 첫 비트를 생략하십시오. 그렇지 않은 경우 각 루트에 이전 루트의 키 및 비트 스트림 (각 첫 번째 비트 제외)이있는 새 부모를 제공 한 다음 해당 트리에 재귀 적으로 참여하십시오.

1/21/2영형(1)1/4후속 재귀 호출은 항상 다른 색상의 나무에 있으므로 동일한 분석이 적용됩니다.

1/2영형(1)

영형(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입니다.

이 오류를 찾는 데 사용한 코드는 다음과 같습니다 .

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