분할 정복 알고리즘 예제

분할 및 정복 알고리즘은 스택, 큐 또는 우선 순위 큐와 같은 일부 명시적 데이터 구조에 부분 하위 문제를 저장하는 재귀가 아닌 프로그램에서 구현할 수도 있습니다. 이 방법을 사용하면 다음에 해결해야 할 하위 문제(예: 너비 우선 재귀 및 함수 최적화를 위한 분기 및 바인딩 된 메서드)에서 중요한 기능을 선택할 때 더 많은 자유를 누릴 수 있습니다. 이 방법은 재귀 프로시저에 대한 지원을 제공하지 않는 프로그래밍 언어의 표준 솔루션이기도 합니다. 나는 많은, 많은 하위 세트에서 데이터를 분할하는 작업이 가치가 없는 것 같아요, 그러나 나는 하나가 두 개의 하위 세트에서 중지해야한다는 것을 볼 수있는 직관이 부족합니다. 우리가 아래에 설명 할 몇 가지 중요한 가정에서, ForkJoin 프레임 워크를 사용하여 작성 된 알고리즘, 특히이 장의 분할 및 정복 알고리즘은 다음과 같은 예상 시간 바인딩이 있습니다 : 분할 및 정복의 초기 예 여러 하위 문제가있는 알고리즘은 현재 쿨리 – 투키 빠른 푸리에 변환 (FFT) 알고리즘이라고 불리는 가우스의 1805 설명입니다[5] 그는 정량적으로 작업 수를 분석하지 않았지만, FFT는 그들이 될 때까지 광범위하게되지 않았다 100년이 넘는 세월 동안 재발견되었습니다. 해시 함수가 순서보존인 경우 O(N) 정렬 알고리즘을 만드는 데 사용할 수 있습니다. (모든 정렬 알고리즘은 숫자의 결과에 숫자가 있어야 하는 위치에 대한 N 검색을 수행하는 것으로 생각할 수 있습니다.) quicksort 및 mergesort와 같은 알고리즘을 분할하고 정복할 때 입력은 일반적으로 (적어도 소개 텍스트에서) 두 개로 분할되고 두 개의 작은 데이터 집합은 재귀적으로 처리됩니다. 두 반쪽이 전체 데이터 집합을 처리하는 작업의 절반 미만을 차지하면 문제를 해결하는 것이 더 빠르다는 것이 합리적입니다. 그러나 데이터 세트를 세 부분으로 나누는 것은 어떨까요? 4개? N? 요즘은 거의 아무도 더 이상 자신의 정렬 알고리즘을 프로그램; 라이브러리에서 제공하는 것을 사용합니다. 예를 들어 Java 7 API는 실제로 이중 피벗 퀵정렬을 사용합니다. 모든 재귀 알고리즘에서 재귀 를 종료하기 위해 직접 해결되는 기본 케이스, 작은 하위 문제를 선택할 때 상당한 자유가 있습니다.

직렬 빠른 정렬재귀분할을 통해 키 시퀀스를 정렬합니다. 다음 의사 코드는 알고리즘을 간략하게 설명합니다: Quicksort는 사소한 분할 및 정복 알고리즘을 병렬화하는 방법을 연구하는 좋은 예입니다. 가장 간단한 형태로, 그것은 자연스럽게 재귀 포크 조인 알고리즘으로 표현된다. 보다 정교한 변형은 부분적으로만 재귀적입니다. 이 섹션에서는 단순 및 정교한 변형 모두에 평행 포크 조인이 어떻게 적용되는지 보여 주며 특정 장단점을 보여 줄 것입니다. 따라서 예를 들어 quicksort의 많은 라이브러리 구현은 정렬할 항목 수가 충분히 적으면 간단한 루프 기반 삽입 정렬(또는 이와 유사한) 알고리즘으로 전환됩니다. 빈 목록이 유일한 기본 케이스인 경우 n 항목으로 목록을 정렬하면 즉시 반환되지만 아무 것도 하지 않는 최대 n quicksort 호출이 수반됩니다. 기본 사례를 크기 2 이하로 늘리면 대부분의 do-nothing 호출이 제거되고 일반적으로 2보다 큰 기본 케이스는 일반적으로 함수 호출 오버헤드 또는 스택 조작에 소요되는 시간을 줄이는 데 사용됩니다. 이러한 분할 및 정복 알고리즘에 대해 까다로운 한 가지는 무한회회처럼 보인다는 것입니다. 더 작은 목록을 정렬할 수 있는 한 목록을 정렬할 수 있다는 것을 계속 증명합니다…. 당신은 당신이 작은 목록을 정렬 할 수 있기 때문에 당신이 할 수있는 알고있는 …

Posted in Uncategorised