KD 트리에서 Octree를 사용하는 이유는 무엇입니까?


32

과학 컴퓨팅에 대한 경험이 있으며 BSP (binary space partitioning) 응용 프로그램에 광범위하게 kd-tree를 사용했습니다. 최근에 3D 유클리드 공간을 분할하기위한 비슷한 데이터 구조 인 octree에 익숙해졌지만, 수집 한 것으로부터 일정한 간격으로 작동하는 것이 있습니다.

약간의 독립적 인 연구에 따르면 kd-trees는 일반적으로 대부분의 데이터 세트에서 성능이 우수합니다. 구성 및 쿼리가 빠릅니다. 내 질문은 공간 / 시간적 성능 또는 다른 점에서 옥트리의 장점은 무엇이며 가장 적합한 상황은 무엇입니까 (3D 그래픽 프로그래밍을 들었습니다)? 두 가지 유형의 장단점을 요약하면 가장 감사하겠습니다.

또한 누군가 R-tree 데이터 구조의 사용법과 장점에 대해 자세히 설명 할 수 있다면 그 점에 대해서도 감사하게 생각합니다. R- 트리 (옥트리보다)는 k- 최근 접 이웃 또는 범위 검색을 위해 kd- 트리와 매우 유사하게 적용되는 것으로 보입니다.


kd-trees와 R-trees (octree는 아님)는 k-nearest 이웃 검색을 용이하게하기 위해 특별히 설계된 것처럼 보입니다.
Noldorin

한 가지주의 할 점은 kd-trees는 작은 깊이를 보장한다는 것입니다. 압축 된 쿼드 트리는 거기에 도착할 수 있지만 덜 편리합니다.
Suresh Venkat

@Suresh Venkat : 감사합니다. 압축 쿼드 트리에 익숙하지 않지만 실제로 3D 공간 담당자에게 적합합니까? 아마도 "압축 된 옥트리"아날로그가있을 것입니다.
Noldorin

또한 알려진 Z 순서 (space-filling) 곡선이있을 때 octrees가 더 적합하다고 들었지만 여기에서 추론에 대해서는 확실하지 않습니다.
Noldorin

답변:


23

셀 A의 팔진 세포 입방체 보장 반면 트리는, 높은 종횡비를 가질 수있다. 이것은 이론 보드이므로 높은 종횡비가 문제가되는 이론적 이유를 알려 드리겠습니다. 볼륨 경계를 사용하여 가장 가까운 인접 쿼리를 해결할 때 검사 해야하는 셀 수를 제어하는 ​​것이 불가능합니다.kD

구체적으로 : 당신이 요청하는 경우 쿼리 포인트에 -approximate 가장 가까운 이웃 Q , 실제 가장 가까운 이웃 거리에있다 D , 당신은 일반적으로 검색을 끝낼 검사 한 모든 데이터 구조 세포 그 안쪽에서 도달 내주를 갖는 환형 또는 환형 쉘의 외부 D 및 외주 ( 1 + ε ) D . 셀이 쿼드 트리에있는 것처럼 종횡비가 경계인 경우 최대 1 / ϵ d - 1 개의 해당 셀이있을 수 있으며 쿼리 시간에 적절한 경계를 증명할 수 있습니다. k 와 같이 종횡비가 제한되지 않은 경우ϵqdd(1+ϵ)d1/ϵd1 트리,이 경계는 적용되지 않습니다.kD

트리는 최대 로그 깊이를 보장하므로 가장 가까운 인접 쿼리 시간에 기여한다는 점에서 쿼드 트리와는 다른 이점이 있습니다. 그러나 쿼드 트리의 깊이는 일반적으로 크지 않은 입력의 최대 정밀도 비트 수이며, 깊이를 본질적으로 로그로 제어하는 ​​이론적 인 방법이 있습니다 (스킵 쿼드 트리 데이터 구조 참조).kD


4
압축 된 쿼드 트리에 대한 최신 요약은 Sariel Har-Peled의 최근 교과서를 참조하십시오.
Jeffε

좋은 양적 요약에 감사드립니다, David. 확인하기 만하면 "종횡비"와 "종횡비"의 동의어가 사용됩니까? 확실히 quadrees / octrees와 압축 된 quadtrees / octrees를 건너 뛰어야합니다.
Noldorin 2016 년

1
직사각형 박스의 종횡비는 가장 긴 가장자리 길이 대 가장 짧은 가장자리 길이의 비로 정의 될 수있다. 이 문맥에서 분기 비율이 무엇을 의미하는지 알지 못하지만 종횡비는 트리의 분기 요인과 관련이 없습니다 (두 데이터 구조 모두에 대해 일정합니다).
David Eppstein 2016 년

나는 "셀을"놓쳤다. 이제 말이 되네요
Noldorin 2016 년

15

친구 그룹과 나는 재미있는 측면 프로젝트로 우주 RTS 게임을하고 있습니다. 우리는 Computer Science에서 배운 많은 것들을 사용하여 효율성을 높이고 나중에 대규모 군대를 만들 수 있습니다.

이 목적을 위해 우리는 kd-trees 사용을 고려했지만 그것들을 신속하게 기각했습니다 : 삽입과 삭제는 프로그램에서 매우 흔합니다 (공간을 비행하는 배를 고려하십시오). 따라서 우리는 게임을 위해 옥트리를 선택했습니다.


아 그래, 나도 이걸 들었어. kd-tree를 사용한 삽입 / 삭제는 비용이 많이 드는 작업입니다 (재 밸런싱으로 인해). 하지만 최고의 시간 복잡도는 여전히 동일하다고 생각합니다.
Noldorin

2
kd-tree를 고치는 방법에 달려 있습니다. 좋은 최고의 시간 복잡도는 내가 일반적으로 목표로하는 것이 아닙니다. 예를 들어 bogosort는 O (1) 최고의 경우 복잡성을 가지고 있지만 아무도 그것을 사용하지 않기를 바랍니다.
Alex ten Brink

불행히도 나는이 데이터 구조에 대한 일반적인 작업에 대한 시간 복잡성에 대한 좋은 요약을 찾을 수 없지만 마음에 들지 않습니다. 평균 사례 시간 복잡도는 종종 통찰력이 있습니다 ...
Noldorin

1
축을 순환하고 단순히 공간을 중간으로 나누는 KD 트리를 사용하면 여전히 더 잘할 것이라고 생각합니다. 부피가 큰 SAH 및 기타 고가의 중간 값 삭감을 건너 뛰면 octree보다 더 빠르게 검색 할뿐만 아니라 더 빠르게 빌드 할 수 있습니다. octree에서와 마찬가지로 8 진 트리가 아닌 이진 트리로 공간을 균등하게 분할하고 있기 때문에 제거를 위해 이전에 무엇을하든 KD-tree는 더 복잡하지 않아야합니다. 비슷한 방식으로 균등 간격으로 배치됩니다. 예 : N의 깊이를 넘어서 빈 노드를 간단히 제거 할 수 있습니다.
Dragon Energy

8

공간 / 시간적 성능 등에서 옥트리의 장점은 무엇이며, 어떤 상황에서 가장 적용 가능합니까 (3D 그래픽 프로그래밍을 들었습니다)?

kD 트리는 균형 잡힌 이진 트리이고 옥트리는 시도 이므로 장점과 단점은 더 일반적인 데이터 구조에서 상속됩니다. 구체적으로 :

  • 재조정은 비용이 많이들 수 있습니다 (octree는 재조정이 필요하지 않습니다).
  • 균형 조정은 이기종이 적응성이 뛰어 나기 때문에 더 잘 처리합니다.
  • 옥트리에서 더 높은 분기 계수는 균질 분포에 대해 더 얕은 트리 (간접 및 할당 수가 적음)를 의미합니다.

또한, (섹 트리에서와 같이) 이분법은 비트 트위들 링 측면에서 사소한 구현에 적합합니다. 마찬가지로, 범위 조회를 수행 할 때 옥트리가 미리 계산 된 거리에서 큰 이점을 얻을 수 있다고 생각합니다.

편집하다

분명히 시도와 동질성에 대한 언급은 명확해야합니다.

Tries 는 딕셔너리 트리로 표현되는 데이터 구조의 패밀리이며 시퀀스 인 키 (대부분은 문자열이지만 DNA 시퀀스 및 해시 시도에 대한 해시 값의 비트)에 대한 딕셔너리로 ​​사용됩니다. 각 사전이 x, y 및 z 좌표 각각의 한 비트 (트리의 첫 번째 레벨에서 가장 중요한 비트, 두 번째 레벨의 다음 중요한 비트 등)를 매핑하는 경우 트리는 3D 공간을 균일하게 세분화하는 옥트리입니다. 따라서 옥트리는 일반적으로 시도의 특성을 상속합니다.

  • 높은 분기 계수는 얕은 트리가 거의 없다는 것을 의미하므로 검색 속도가 빠릅니다. 예를 들어 분기 수준이 256 인 4 단계 트리에 20 단계의 이진 트리를 저장할 수 있습니다.
  • 삽입 및 삭제 중에 시도가 재조정되지 않으므로 균형 잡힌 이진 트리에 필요한 값 비싼 작업이 줄어 듭니다.

단점은 이종성이 불균형 한 시도 / 옥트리를 초래할 수 있으므로 검색에 많은 간접적 인 지시가 필요할 수 있다는 것입니다. 시도에서 동등한 문제는 여러 수준의 간접 지향을 단일 수준으로 축소하기 위해 에지 압축을 사용하여 해결됩니다. Octrees는 이것을하지 않지만 octree를 압축하는 것을 막을 수있는 것은 없습니다 (그러나 결과를 octree라고 부를 수는 없다고 생각합니다!).

비교를 위해 trie로 표시되는 문자열 키에 대한 특수 사전을 고려하십시오. 트라이의 첫 번째 레벨은 키의 첫 번째 문자에서 분기됩니다. 두 번째 캐릭터의 두 번째 레벨 등. 사전의 키에서 첫 번째 문자를 검색하여 키에서 두 번째 문자를 찾는 데 사용되는 두 번째 사전을 가져 와서 모든 문자열을 조회 할 수 있습니다. 임의의 키 문자열 세트는 동종 분포입니다. 모든 접두사를 공유하는 키 문자열 세트 (예 : "anti"로 시작하는 모든 단어)는 이기종입니다.분포. 후자의 경우, 첫 번째 사전에는 "a"에 대한 바인딩 하나, "n"에 대한 두 번째 바인딩 만 포함합니다. 동일한 4 개의 키를 사용하여 동일한 4 개의 사전을 검색하여 항상 트리에서 매핑을 검색합니다. 이것은 비효율적이며, 예를 들어 대다수의 입자가 벡터 공간 내에서 작은 부피로 존재하는 이종 입자 분포를 저장하는 데 사용되는 경우 옥트리가 수행하는 작업입니다.


"octrees are tries"? 또한, "이질성을 더 잘 처리"한다는 것은 무엇을 의미합니까? 동종은 나무와 관련하여 내가 만난 단어가 아닙니다.
Noldorin

2
"Octtree는 재조정이 필요하지 않습니까?" 이기종 점 분포를 저장하는 옥트 트리에는 해당되지 않습니다. 또는 일반적으로 "octtree"를 정의하는 방법에 따라 : octtree 재조정은 아무리 바람직한 경우에도 불가능 합니다.
Jeffε

@Noldorin "octrees are tries"입니다. 예. 트라이가 무엇인지 아십니까? en.wikipedia.org/wiki/Trie
Jon Harrop 2018 년

@Noldorin "동종은 나무와 관련하여 만난 단어가 아닙니다". 나는 분할되고있는 분포의 동질성을 언급하고있다. 예를 들어, 3D 공간에서 입자를 분할하면 고체의 원자가 균질하게 분포되는 반면 우주의 별은 이질적으로 분포됩니다. kD 트리는 공간의 세분화가 적응성이기 때문에 이종 분포에 더 적합합니다.
Jon Harrop 2018 년

@ Jɛ ff E "옥트 트리 재조정은 단순히 불가능합니다." 그것이 바로 내가 말한 것입니다. 내 말이 혼란 스러우면 사과드립니다.
Jon Harrop 2018 년

2

옥트리는 연속체 모델의 기본 데이터 유형으로 유용합니다 (예 : Gerris 흐름 솔버 참조). 유체 역학에서는 수명이 충분히 어려우므로 모든 서브 큐브의 크기가 깊이에 따라 달라진다는 사실을 아는 것은 단순화해야합니다.

주의 사항 : 나는 유동적 인 역 동성이 아닙니다!


흥미 롭군 나는 연속체 모델에서 octrees를 사용하는 것이 더 간단하다는 것을 분명히 이해할 수 있습니다 ... 그래픽 프로그래밍의 이유가 무엇인지 궁금합니다.
Noldorin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.