퀵홀
QuickhullQuickhull은 n차원 공간에서 유한한 점 집합의 볼록한 선체를 계산하는 방법입니다.퀵소트와 비슷한 이름의 분할 정복 방식을 사용한다.2차원 및 3차원 공간의 최악의 복잡도는 log (){ O ( \ ( ) }。 n}는 입력 포인트 수, { r은 처리 포인트 [1]수입니다.단, Quicksort와 달리 Quickhull을 랜덤화 알고리즘으로 변환하는 명확한 방법은 없습니다.그럼에도 불구하고, Smoothed 분석 이는 2차원 퀵 선체 알고리즘 런타임 O(n로그 (n)){\displaystyle O(n\log(n))}. Indeed,[2]및 관련 작품 지점의 가우스 잡음과 무작위로 냉정을 잃pointset의 볼록 선체에 번호는 O(로그 n)을 보여 줄 거 작품 존재한다. 선체(및 기타 많은 알고리즘)는 교란된 포인트 세트(subtent points)에서 O logn O{\ n만 소요됩니다
N차원 퀵헐은 1996년 C에 의해 발명되었다.브래드포드 바버, 데이비드 P. 돕킨, 그리고 한누 허단파아.[1]이것은 조나단 스콧 [3]그린필드의 1990년 평면 퀵헐 알고리즘의 연장선이었지만 1996년 저자들은 그의 방법을 알지 못했다.대신, Barber 등은 이것을 Clarkson과 Shor의 1989년 [1]알고리즘의 결정론적 변종이라고 설명한다.
알고리즘.
평균적인 상황에서는 알고리즘이 매우 잘 작동하지만, 일반적으로 대칭이 높거나 원의 둘레에 있는 점의 경우 처리가 느려집니다.알고리즘은 다음 단계로 [3]나눌 수 있습니다.
- 최소 및 최대 x 좌표가 있는 점은 항상 볼록 선체의 일부가 되므로 점을 찾습니다.동일한 최소/최대 x를 가진 점이 여러 개 있는 경우 해당 최소/최대 y를 가진 점을 사용합니다.
- 두 점으로 형성된 선을 사용하여 세트를 두 점의 하위 집합으로 나누고, 이 하위 집합은 재귀적으로 처리됩니다.
- 선에서 최대 거리를 가진 선 한쪽에 있는 점을 확인합니다.이 점은 직선의 점과 삼각형을 이룬다.
- 이 삼각형의 내부에 있는 점은 볼록 선체의 일부가 될 수 없으므로 다음 단계에서 무시할 수 있습니다.
- (첫 번째 선이 아닌) 삼각형으로 형성된 두 선에 대해 앞의 두 단계를 반복합니다.
- 더 이상 점이 남지 않고 재귀가 종료되고 선택한 점이 볼록 선체를 구성할 때까지 이 작업을 계속합니다.
선체는 여러 면에서 제작되기 때문에 고차원적인 경우에는 문제가 더 복잡합니다. 데이터 구조에서는 이를 고려하여 인접 시설에서 공유하는 라인/플레인/하이퍼플레인(리지)도 기록해야 합니다.d [1]치수의 경우:
- 평면 또는 하이퍼플레인을 공유하지 않는 세트에서 d + 1 포인트를 선택합니다.이것은 F[]패싯을 가진 초기 선체를 형성한다.
- Fs[의 각 F에 대해, 그 "위"에 있는 모든 미지정 점, 즉 선체 중심에서 먼 곳을 가리키고 이를 "외부" 집합 F에 추가합니다.F와 관련된 O.
- 각 F에 대해 F가 비어 있지 않습니다.O:
- F에서 최대 거리를 갖는 점 p를 구한다.선체에 추가합니다.
- Visible set V를 생성하여 F로 초기화합니다.p에서 더 이상의 패싯이 보이지 않을 때까지 인접 패싯 Fv에 대해 V를 모든 방향으로 확장합니다.p에서 Fv가 보이는 것은 p가 Fv보다 크다는 것을 의미합니다.
- 그리고 나서 V의 경계는 일련의 수평선 H를 형성한다.
- Fnew[]는 p와 H의 모든 능선에서 생성된 패싯 집합이라고 하자.
- Fnew [ ]의 새로운 각 패싯에 대해 스텝 (2)를 실행하여 자체 외부 세트를 초기화합니다.이 시간은 외부 집합 V[i]를 사용하여 V의 면 외부에 있는 지점에서만 볼 수 있습니다.오, 우리는 그 방향으로만 확장했으니까.
- V의 내부 패싯을 FS[]에서 삭제합니다.Fnew[]의 새 패싯을 FS[]에 추가하고 반복을 계속합니다.
2D 점 세트에 대한 유사 코드
입력은 S와 점의 설정이 적어도 2점 입력에 있는 지점 S을 세웠다 QuickHull(S)은 // 기능의 점의 집합 S볼록 헐에서 볼록 선체 찾기:={}을 찾고 대부분의 포인트, A및이라고 말한다. B, A및을 추가한다; 남아 B 볼록하선체 SegmentAB2그룹으로 나머지(n− 2)점을 나누는 S1a걸로 추정이 일고S2nd여기서 S1은 A에서 B까지 방향선의 오른쪽에 있는 S의 점이고, S2는 B에서 A FindHull(S1, A, B) FindHull(S2, B, A) 출력: 볼록형 Hull(S2, B, A) 함수 찾기:// P에서 Q까지 방향 선 오른쪽에 있는 점의 경우, Sk에 포인트가 없으면 Sk에 있는 특정 점 집합에서, 예를 들어 C를 세그먼트 PQ Add point C에서 P와 Q, C 사이의 볼록 선체에 이르는 가장 먼 점의 P, Q, C 세 점의 나머지 점들을 Sets로 분할한다.여기서 S0은 삼각형 PCQ 안쪽에 있는 점, S1은 P에서 C까지의 방향선 오른쪽에 있는 점, S2는 C에서 Q까지의 방향선 오른쪽에 있는 점.FindHull(S1, P, C) FindHull(S2, C, Q) 종료 함수 3D 케이스에 특화된 의사 코드는 Jordan Smith에서 구할 수 있습니다.여기에는 출발 선체를 선택할 때 유사한 "최대점" 전략이 포함됩니다.이러한 최대점이 퇴화되면 전체 점 [4]구름도 퇴화됩니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b c d Barber, C. Bradford; Dobkin, David P.; Huhdanpaa, Hannu (1 December 1996). "The quickhull algorithm for convex hulls" (PDF). ACM Transactions on Mathematical Software. 22 (4): 469–483. doi:10.1145/235815.235821.
- ^ Devillers, Olivier; Glisse, Xavier Goaoc; Thomasse, Remy (2015). On the Smoothed Complexity of Convex Hulls. 31st International Symposium on Computational Geometry. Schloss Dagstuhl--Leibniz-Zentrum fuer Informatik.
- ^ a b Greenfield, Jonathan S. (1 April 1990). "A Proof for a QuickHull Algorithm". Electrical Engineering and Computer Science - Technical Reports.
- ^ Smith, Jordan. "QuickHull 3D". algolist.ru. Retrieved 22 October 2019.
- Dave Mount. "Lecture 3: More Convex Hull Algorithms".
- 의사코드, "http://www.cse.yorku.ca/~aaw/Hang/quick_hull/Algorithm.html"
외부 링크
- QuickHull 구현 (GDC 2014)– 3D 구현 세부사항을 포함한 알고리즘 프레젠테이션