공간 분할은 최악의 경우 항상 O (N ^ 2)이며 정보학의 복잡성에 관한 것입니다.
그러나 선형 시간 O (N)에서 작동하는 알고리즘이 있습니다 . 그들 모두는 일종의 스윕 라인을 기반으로합니다.
기본적으로 객체를 하나의 좌표로 정렬해야합니다. X라고 가정 해 봅시다. 충돌 감지 전에 매번 정렬을 수행하면 복잡도는 O (N * logN)입니다. 트릭은 장면에 객체를 추가 할 때와 나중에 장면의 무언가가 변경 될 때만 정렬하는 것입니다. 이동 후 정렬이 간단하지 않습니다. 움직임을 취하고 여전히 선형 시간으로 작동하는 알고리즘에 대해서는 아래 링크 된 문서를 참조하십시오 .
그런 다음 왼쪽에서 오른쪽으로 스윕합니다. 스윕 선이 객체의 시작 부분을 지나갈 때마다 임시 목록에 배치합니다. 스윕 라인이 객체를 빠져 나갈 때마다리스트에서 꺼냅니다. 이 임시 목록 내에서만 충돌을 고려합니다.
순진한 스윕 라인은 최악의 경우에도 O (N ^ 2)입니다 (모든 객체를 왼쪽에서 오른쪽으로 전체 맵으로 확장). 그러나 더 똑똑하게 만들어 O (N)로 만들 수 있습니다 (아래 링크 참조). 정말 좋은 알고리즘은 매우 복잡합니다.
다음은 스윕 라인 작동 방식에 대한 간단한 다이어그램입니다.
선이 왼쪽에서 오른쪽으로 스윕됩니다. 개체는 X 좌표로 정렬됩니다.
- 사례 1 : 처음 두 개체가 검사됩니다. 다른 것은 중요하지 않습니다.
- 사례 2 : 첫 번째 개체가 확인되었고 목록에서 사라졌습니다. 둘과 셋이 확인됩니다.
- 사례 3 : 해당 개체가 충돌하더라도 검사하지 않습니다.
- 사례 4 : 우리는이 경우를 확인하기 때문에!
이와 같은 알고리즘은 복잡도 O (C * N) = O (N)을 갖습니다.
출처 : 2 년간의 계산 기하학 과정.
충돌 감지에서는 일반적으로 Sweep and Prune 이라고 하지만 스위프 라인 알고리즘 계열은 다른 많은 분야에서 유용합니다.
또한 나는이 질문의 범위를 벗어난 생각하지만, 그럼에도 불구하고 흥미로운 독서 권장 : 효율적인 대규모 스윕 및 AABB 삽입과 자두 방법 및 제거 -이 종이 선물 용도가 경계 상자 정렬 축 것을 향상된 스윕와 자두 알고리즘을 (AABB 이동을 고려한 정렬 논문에 제시된 알고리즘은 선형 시간으로 작동합니다.
이제주의 이 이론에서 가장 알고리즘이다 . 그것이 사용된다는 의미는 아닙니다. 실제로, 공간 분할을 갖는 O (N ^ 2) 알고리즘은 전형적인 경우 (O (N)에 가까운) 더 나은 성능 속도와 메모리에 대한 추가 요구 사항을 갖습니다. O (C * N)의 상수 C가 매우 높을 수 있기 때문입니다! 일반적으로 메모리가 충분하고 일반적인 경우 공간에 객체가 고르게 분포되어 있기 때문에 이러한 알고리즘은 더 나은 성능을 발휘합니다. 그러나 O (N)는 원래 질문에 대한 답입니다.