분할정복 알고리즘 예제

분할 및 정복 알고리즘은 재귀 프로시저로 자연스럽게 구현됩니다. 이 경우 현재 해결 중인 문제로 이어지는 부분 하위 문제는 프로시저 호출 스택에 자동으로 저장됩니다. 재귀 함수는 정의 내에서 자신을 호출하는 함수입니다. 이 분할 및 정복 기술은 정렬 (예 : 빠른 정렬, 병합 정렬), 큰 숫자 (예 : Karatsuba 알고리즘) 곱하기, 가장 가까운 점 쌍 찾기, 구문 분석 ( 예를 들어, 하향식 파서, 그리고 이산 푸리에 변환(FFT)을 계산합니다. [인용 필요] MATLAB 함수를 사용하여 dconquer를 구현하는 것은 어렵습니다. MATLAB에서 함수를 호출 할 수있는 방식으로 프로그래밍 언어 C에서 myMEX와 같은 함수를 작성할 수 있습니다. myMEX 함수는 MEX 인터페이스라고 불리는 것을 준수하고 MATLAB 명령 mex를 사용하여 컴파일되어야 합니다(참조 참조[20]). 이 인터페이스는 MATLAB에서 함수를 호출할 때 입력 및 출력 매개 변수에 대한 액세스를 제공합니다. 일반적으로 이 함수는 Fortran 또는 C 기계 코드 라이브러리에 대한 인터페이스를 제공합니다. 예를 들어, LAPACK [62]는 선형 방정식의 시스템 해결 방법, 방정식의 선형 시스템의 최소 제곱 솔루션, 이젠 값 문제 및 다양한 요인화 실행방법을 제공하는 Fortran에서 작성된 함수 집합입니다. LAPACK 함수 중 하나인 dsyevd는 A를 대칭 삼각 행렬로 변환한 다음 분할 및 정복 알고리즘을 적용하여 고유 값과 해당 고유 벡터를 계산합니다. 고유 값만 계산하지만 고유 값만 원한다면 분할 및 정복 알고리즘에는 이점이 없습니다.

하향식 분할 및 정복 알고리즘은 적어도 피상적으로 는 피상적으로 커버링 알고리즘과 매우 유사한 방식으로 동일한 데이터에서 작동합니다. 먼저 x 특성을 사용하여 데이터 집합을 분할할 수 있으며, x=1.2와 같은 장소에서 데이터 집합을 분할할 수 있습니다. 그러나 커버링 알고리즘은 단일 클래스를 포함하는 것과만 관련이 있는 반면 분할 및 정복 알고리즘은 모든 클래스에 적용되는 단일 개념 설명을 만들기 때문에 두 클래스를 모두 고려합니다. 두 번째 분할은 동일한 장소인 y=2.6에 있을 수도 있으며, 그림 4.6B의 의사 결정 트리로 이어질 수 있습니다. 이 트리는 규칙 집합에 정확히 해당하며 이 경우 피복 알고리즘과 분할 및 정복 알고리즘 간에는 효과가 없습니다. 대부분의 재귀 알고리즘은 반복 모델로 표현될 수 있으며, 일반적으로 GPU의 기본 타일 기반 분해 모델에 더 잘 맞기 때문에 GPU에 매핑하기가 다소 쉽습니다. 재귀 알고리즘을 선택할 때 개발 시간과 성능의 절충을 하고 있다는 점에 유의하십시오. 이러한 접근 방식을 반복 알고리즘으로 변환하는 것보다 재귀 알고리즘을 개념화하고 코딩하는 것이 더 쉬울 수 있습니다. 그러나 각 재귀 호출을 사용하면 형식 매개 변수가 로컬 변수와 함께 스택에 푸시됩니다. GPU와 CPU는 글로벌 메모리 공간의 메모리 영역과 같은 방식으로 스택을 구현합니다. CPU와 Fermi 급 GPU는 레지스터를 사용하여 값을 전달하는 것과 비교하여이 영역을 캐시하지만 속도가 느립니다.

가능한 경우 반복 솔루션을 사용하면 일반적으로 훨씬 더 나은 성능을 발휘하고 더 넓은 범위의 GPU 하드웨어에서 실행됩니다. 분할 및 정복 패러다임은 종종 효율적인 알고리즘을 발견하는 데 도움이됩니다. 예를 들어, Karatsuba의 빠른 곱셈 방법, quicksort 및 병합 정렬 알고리즘, 행렬 곱셈을 위한 스트라센 알고리즘 및 빠른 푸리에 변환의 핵심이 되었습니다.