분할 및 재무 알고리즘

Divide-and-conquer algorithm

컴퓨터 과학에서, 분열과 정복알고리즘 설계 패러다임이다.분할 및 변환 알고리즘은 문제가 직접 해결할 수 있을 정도로 간단해질 때까지 재귀적으로 같은 유형 또는 관련 유형의 두 개 이상의 하위 문제로 문제를 세분화한다.그런 다음 하위 문제에 대한 해결책이 결합되어 원래의 문제에 대한 해결책을 제시한다.

분할 및 변환 기법은 정렬(예: 퀵소트, 병합 정렬), 큰 숫자 곱하기(예: 카라츠바 알고리즘), 가장 가까운 점찾기, 구문 분석(예: 하향 파서), 이산 푸리에 변환(FFFT) 계산과 같은 많은 문제에 대한 효율적인 알고리즘의 기본이다.[1]

효율적인 분할 및 재무 알고리즘 설계는 어려울 수 있다.수학적 유도에서와 마찬가지로, 재귀적 해결책에 순응할 수 있도록 문제를 일반화할 필요가 있는 경우가 많다.분할-상호 알고리즘의 정확성은 대개 수학적 유도에 의해 증명되며, 그 계산 비용은 종종 반복 관계를 해결함으로써 결정된다.

분열시켜 정복하다.

분할 및 재무 접근 방식으로 목록 정렬(38, 27, 43, 3, 9, 82, 10)상위 절반: 하위 목록으로 분할; 중간: 1개 요소 목록이 사소한 방식으로 정렬됨; 하위 절반: 정렬된 하위 목록 작성

분할-통화 패러다임은 종종 문제의 최적의 해결책을 찾기 위해 사용된다.그것의 기본 아이디어는 주어진 문제를 둘 이상의 유사하지만 간단한 하위 문제로 분해하여 차례로 해결하고, 주어진 문제를 해결하기 위해 그들의 해결책을 구성하는 것이다.충분한 단순성의 문제는 직접 해결된다.예를 들어, 주어진 n개의 자연수 목록을 정렬하려면 n/2개의 숫자로 된 두 개의 목록으로 나누어 각각 하나씩 정렬하고, 두 결과를 적절하게 상호 교환하여 지정된 목록의 정렬 버전을 얻으십시오(그림 참조).이 접근방식은 병합 정렬 알고리즘으로 알려져 있다.

정렬된 목록에서 레코드를 찾기 위한 바이너리 검색 알고리즘(또는 숫자 컴퓨팅에서의 그것의 아날로그, 루트 소견을 위한 이분법 알고리즘)과 같이 각 문제를 하나의 하위 문제로 축소하는 알고리즘에 "분할과 정복"이라는 명칭이 적용되기도 한다.[2]이러한 알고리즘은 일반적인 분할-통화 알고리즘보다 더 효율적으로 구현될 수 있다. 특히 꼬리 재귀(tail recursion)를 사용하면 단순한 루프로 변환할 수 있다.그러나 이 넓은 정의에 따르면, 재귀나 루프를 사용하는 모든 알고리즘은 "분할 및 재무 알고리즘"으로 간주될 수 있다.따라서 일부 저자들은 각각의 문제가 둘 이상의 하위 문제를 일으킬 수 있는 경우에만 "분열과 정복"이라는 이름을 사용해야 한다고 생각한다.[3]단문제계급에 대해서는 대신 감소와 정복이라는 명칭이 제안되었다.[4]

분할 정복의 중요한 응용 프로그램 검색이 우주("술 취한") 일정한 요소에 의해 각각의 단계에서 감소된다 이곳은 전반적인 알고리즘이 계속된 가지 치기 인자(기하학적 시리즈를 합산하여)과 가지 치기 단계와 같은 점근 복잡성을 가지optimization,[예가 필요했다]다. 이것 pru으로 알려져 있다.완벽하고 검색.

초기 역사적 사례

이러한 알고리즘의 초기 예는 주로 감소되고 정복된다 – 원래의 문제는 연속적으로 단일 하위 문제로 분해되며, 실제로 반복적으로 해결될 수 있다.

하위 문제가 원래 크기의 대략 절반인 감소 및 대기 알고리즘인 바이너리 검색은 긴 역사를 가지고 있다.컴퓨터 알고리즘에 대한 명확한 설명이 1946년 존 모클리의 기사에서 나타났지만, 검색을 용이하게 하기 위해 항목들의 정렬된 목록을 사용하는 아이디어는 적어도 기원전 200년 바빌로니아까지 거슬러 올라간다.[5]또 다른 고대 감산-통화 알고리즘은 기원전 수세기까지 거슬러 올라가는 더 작고 더 작은 등가 하위 문제로 숫자를 줄임으로써 두 숫자의 가장공통점을 계산하는 유클리드 알고리즘이다.

다수의 하위 문제를 가진 분할 및 분할 알고리즘의 초기 예는 현재 쿨리-이라 불리는 것에 대한 가우스의 1805년 기술이다.Tukey fast Fourier transform(FFT) 알고리즘은 그가 그것의 운용 카운트를 정량적으로 분석하지는 않았지만,[6] FFTs는 1세기 후에 재발견될 때까지 널리 퍼지지 않았다.

컴퓨터를 위해 특별히 개발되어 적절히 분석된 초기 2문제 D&C 알고리즘은 1945년 존 노이만이 발명한 병합 분류 알고리즘이다.[7]

또 다른 주목할 만한 예는 아나톨리 A에 의해 발명된 알고리즘이다. 개의 n자리 숫자를 O( displaystyle 연산(Big O 표기법)으로 곱할 수 있는 1960년[8] 카라츠바.이 알고리즘은 이 작업에 ) 연산이 필요할 것이라는 안드레이 콜모고로프의 1956년 추측을 반증했다.

도날드 크누스는 원래 컴퓨터를 포함하지 않았던 분할 및 분할 알고리즘의 또 다른 예로서 우체국에서 우편물을 발송할 때 일반적으로 사용하는 방법을 제시한다: 글자는 서로 다른 지리적 영역에 대해 별도의 봉투로 분류되며, 이 가방들 각각은 더 작은 하위 영역을 위해 일괄적으로 분류된다.이것은 1929년 초에 펀치 카드 분류기에 대해 기술된 라딕스 분류와 관련이 있다.[5][5]

이점

어려운 문제 해결

분열과 정복은 개념적으로 어려운 문제를 해결하는 강력한 도구로서, 필요한 것은 문제를 하위문제로 쪼개고, 사소한 사건을 해결하는 방법이며, 하위문제와 원래의 문제를 결합하는 방법뿐이다.마찬가지로, 감소와 정복은 단지 하나의 작은 문제로만 문제를 줄일 필요가 있다. 예를 들어, 고전적인 하노이 탑 퍼즐은 n의 탑을 움직여 n -의 탑을 이동시키는 것을 줄인다

알고리즘 효율

분할 및 분할 패러다임은 종종 효율적인 알고리즘을 발견하는 데 도움이 된다.예를 들어 카라츠바의 빠른 곱셈법, 퀵소트 및 병합 알고리즘, 매트릭스 곱셈을 위한 스트라센 알고리즘, 빠른 푸리에 변환의 핵심이었다.

이러한 모든 사례에서, D&C 접근방식은 솔루션의 점증적 비용 개선을 이끌었다.예를 들어, (a) 베이스 케이스의 크기가 일정한 경우, 문제를 분할하고 부분적인 해결책을 결합하는 작업은 문제의 n{\에 비례하며 (b) 각 단계에서 크기 p {/ {\n/ 하위 문제의 경계 p{\}이 분할 및 변환 알고리즘의 ost는 ) 가 될 것이다

병렬주의

분할-컨커머 알고리즘은 멀티프로세서 머신, 특히 프로세서 간 데이터 통신을 미리 계획할 필요가 없는 공유 메모리 시스템에서 실행하기 위해 자연스럽게 조정된다. 왜냐하면 서로 다른 프로세서에서 구별되는 서브 문제가 실행될 수 있기 때문이다.

메모리 액세스

분할 및 변환 알고리즘은 당연히 메모리 캐시를 효율적으로 사용하는 경향이 있다.그 이유는 일단 하위 문제가 충분히 작으면, 그것과 모든 하위 문제가 원칙적으로 더 느린 메인 메모리에 접근하지 않고 캐시 내에서 해결될 수 있기 때문이다.캐쉬 크기를 명시적 매개 변수로 포함하지 않기 때문에 이러한 방식으로 캐쉬를 이용하도록 설계된 알고리즘을 캐쉬 옵빌리언스라고 한다.[9]더욱이, D&C 알고리즘은 중요한 알고리즘(예: 정렬, FFT, 매트릭스 곱하기)이 캐쉬에 대한 최적의 알고리즘이 되도록 설계될 수 있다. 그들은 캐쉬 크기에 관계 없이 점증적 의미로 캐쉬를 아마도 최적의 방법으로 사용한다.이와는 대조적으로, 루프 중첩 최적화에서와 같이 캐시를 이용하는 전통적인 접근방식은 차단이다. 여기서 문제는 적절한 크기의 청크로 명시적으로 구분된다. 이것은 또한 캐시를 최적으로 사용할 수 있지만, 특정 시스템의 특정 캐시 크기에 대해 알고리즘이 조정되어야만 한다.

NUMA가상 메모리와 같은 다른 계층적 스토리지 시스템과 다중 수준의 캐시에 대해서도 동일한 이점이 존재한다. 하위 문제가 충분히 작으면 상위(하위) 레벨에 액세스하지 않고도 주어진 계층 수준 내에서 해결할 수 있다.

반올림 제어

반올림된 산술(예: 부동 소수점)을 사용한 계산에서 분할 및 변환 알고리즘은 피상적으로 동등한 반복 방법보다 더 정확한 결과를 산출할 수 있다.예를 들어, 각 기준점을 단일 변수에 추가하는 단순한 루프나 데이터 세트를 두 반으로 쪼개 각 절반의 합계를 재귀적으로 계산한 후 두 개의 합계를 추가하는 쌍체합계라는 D&C 알고리즘에 의해 N 숫자를 추가할 수 있다.두 번째 방법은 첫 번째와 동일한 횟수의 추가를 수행하고 재귀 호출의 오버헤드를 지불하지만, 대개는 더 정확하다.[10]

구현 문제

재귀

분할 및 재무 알고리즘은 재귀적 절차로 자연스럽게 구현된다.이 경우 현재 해결되고 있는 문제로 이어지는 부분적인 하위 문제는 자동으로 절차스택에 저장된다.재귀함수는 그 정의 내에서 자신을 부르는 함수다.

명시적 스택

분할 및 변환 알고리즘은 또한 스택, 대기열 또는 우선 순위 대기열과 같은 일부 명시적 데이터 구조에 부분적인 하위 문제를 저장하는 비재발적 프로그램에 의해 구현될 수 있다.이 접근방식은 다음에 해결해야 할 하위 문제, 예를 들어 폭 우선 재귀 및 기능 최적화를 위한 분기 및 바인딩 방식과 같은 일부 애플리케이션에서 중요한 기능을 선택할 때 더 많은 자유를 허용한다.이 접근법은 재귀적 절차에 대한 지원을 제공하지 않는 프로그래밍 언어의 표준 해결책이기도 하다.

힙 크기

D&C 알고리즘의 재귀 구현 시 재귀 스택에 할당된 메모리가 충분한지 확인해야 하며 그렇지 않으면 스택 오버플로로 인해 실행이 실패할 수 있다.시간 효율적인 D&C 알고리즘은 재귀 깊이가 상대적으로 작은 경우가 많다.예를 들어, 퀵소트 알고리즘을 구현하여 {\}n 항목을 정렬하는 데 2{\개 이상의 중첩 재귀 호출이 필요하지 않도록 할 수 있다.

많은 컴파일러들이 재귀 스택이 메모리의 연속적인 영역이라고 가정하고 일부는 그에 대해 일정한 공간을 할당하기 때문에 재귀적 절차를 사용할 때 스택 오버플로를 피하기 어려울 수 있다.컴파일러는 또한 반송 주소, 불변 매개변수 및 절차의 내부 변수와 같이 엄격히 필요한 것보다 더 많은 정보를 재귀 스택에 저장할 수 있다.따라서 재귀 절차의 매개변수와 내부 변수를 최소화하거나 명시적 스택 구조를 사용하여 스택 오버플로 위험을 줄일 수 있다.

기준 사례 선택

어떤 재귀 알고리즘에서든 재귀 종료를 위해 직접 해결되는 작은 하위 문제인 기본 사례의 선택에 상당한 자유가 있다.

가능한 가장 작거나 간단한 기본 사례를 선택하는 것은 더 우아하고 일반적으로 고려할 사례가 적고 해결하기가 더 쉽기 때문에 더 간단한 프로그램으로 이어진다.예를 들어, FFT 알고리즘은 입력이 단일 샘플일 때 재귀가 중지될 수 있고, 퀵소트 목록 정렬 알고리즘은 입력이 빈 목록일 때 중지될 수 있다. 두 예 모두 고려할 기본 사례가 하나뿐이며 처리가 필요하지 않다.

한편, 비교적 큰 베이스 케이스에서 재귀가 멈추면 효율이 향상되는 경우가 많고, 이러한 것들은 비반복적으로 해결되어 하이브리드 알고리즘이 된다.이 전략은 효과가 거의 없거나 전혀 없는 재귀 호출의 오버헤드를 방지하고 또한 그러한 기본 사례에 대해 명시적 재귀보다 더 효율적인 전문 비재귀 알고리즘을 사용할 수 있게 할 수 있다.단순한 하이브리드 재귀 알고리즘의 일반적인 절차는 팔 길이 재귀라고도 하는 베이스 케이스의 단락이다.이 경우, 다음 단계로 인해 기능 호출 전에 베이스 케이스가 발생하는지 여부를 확인하여 불필요한 기능 호출을 피한다.예를 들어, 트리에서 하위 노드로 재귀한 다음 null인지 여부를 확인하는 대신, 재귀하기 전에 null을 확인하는 것이 아니라, 이진 트리의 일부 알고리즘에서 함수 호출의 절반을 방지한다.D&C 알고리즘은 결국 각 문제 또는 하위 문제 인스턴스를 많은 수의 기본 인스턴스로 줄이기 때문에, 특히 분할/접속 오버헤드가 낮은 경우 알고리즘의 전체 비용을 지배하는 경우가 많다.이러한 고려사항은 재귀가 컴파일러에 의해 구현되는지 아니면 명시적 스택에 의해 구현되는지 여부에 따라 달라지지 않는다는 점에 유의하십시오.

따라서 예를 들어, 퀵소트의 많은 라이브러리 구현은 정렬할 항목의 수가 충분히 적으면 간단한 루프 기반 삽입 정렬(또는 유사한) 알고리즘으로 전환된다.빈 목록이 유일한 기본 사례인 경우, 을 n{\n} 항목으로 정렬하면 즉시 반환만 할 있는최대 n {\ n 퀵소트 호출이 수반된다는 점에 유의하십시오.베이스 케이스를 사이즈 2 이하의 목록으로 늘리면 대부분의 아무것도 하지 않는 콜이 제거되며, 일반적으로 2보다 큰 베이스 케이스는 기능-콜 오버헤드 또는 스택 조작에 소요되는 시간의 분율을 줄이기 위해 사용된다.

또는 여전히 분할 및 재무 알고리즘을 사용하는 큰 베이스 케이스를 채택할 수 있지만, 알고리즘을 재귀, 루프 또는 조건(부분 평가 기법 관련)이 없는 코드로 완전히 분리할 수 있는 미리 정해진 크기의 집합에 대해 알고리즘을 구현할 수 있다.예를 들어, 이 접근방식은 일부 효율적인 FFT 구현에 사용되며, 여기서 기본 사례는 고정 크기 집합에 대한 분할 및 재무 FFT 알고리즘의 미연봉 구현이다.[11]소스 코드 생성 방법은 이 전략을 효율적으로 구현하기 위해 바람직한 다수의 개별 베이스 케이스를 생산하기 위해 사용될 수 있다.[11]

이 사상의 일반화된 버전은 재귀 "해결" 또는 "해결"이라고 알려져 있으며, 베이스 케이스 확대 절차를 자동화하기 위한 다양한 기법이 제안되어 왔다.[12]

반복 하위 문제 공유

몇몇 문제들에 대해, 분기된 재귀들은 같은 하위 문제를 여러 번 평가하게 될 수도 있다.그러한 경우, 이러한 중복되는 하위 문제에 대한 해결책을 식별하고 저장할 가치가 있을 수 있으며, 기법은 일반적으로 메모화라고 알려져 있다.한계에 도달하면 동적 프로그래밍차트 파싱과 같은 상향식 분할 및 재무 알고리즘이 발생한다.

참고 항목

참조

  1. ^ Blahut, Richard (14 May 2014). Fast Algorithms for Signal Processing. Cambridge University Press. pp. 139–143. ISBN 978-0-511-77637-3.
  2. ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein (31 July 2009). Introduction to Algorithms. MIT Press. ISBN 978-0-262-53305-8.
  3. ^ 브래서드, G, 브래틀리, P.알고리즘의 기본, 프렌티스 홀, 1996.
  4. ^ Anany V.레비틴, 알고리즘 설계 분석 소개 (Addison Wesley, 2002)
  5. ^ a b c 도날드 E. 크누스, 컴퓨터 프로그래밍의 기술: 제3권, 분류검색, 제2판 (Addison-Wesley, 1998)
  6. ^ Heideman, M. T, D. H. Johnson, C. S. Burrus, "가우스와 빠른 푸리에 변환의 역사", IEEE ASSP 매거진 1, (4) 14–21(1984)이다.
  7. ^ Knuth, Donald (1998). The Art of Computer Programming: Volume 3 Sorting and Searching. p. 159. ISBN 0-201-89685-0.
  8. ^ Karatsuba, Anatolii A.; Yuri P. Ofman (1962). "Умножение многозначных чисел на автоматах". Doklady Akademii Nauk SSSR. 146: 293–294. 번역된 위치
  9. ^ M. Frigo; C. E. Leiserson; H. Prokop (1999). "Cache-oblivious algorithms". Proc. 40th Symp. On the Foundations of Computer Science: 285–297. doi:10.1109/SFFCS.1999.814600. ISBN 0-7695-0409-4. S2CID 62758836.
  10. ^ 니콜라스 J.Higham, "부동점 합산의 정확성", SIAM J. Scientific Computing 14 (4), 783–799 (1993).
  11. ^ a b Frigo, M.; Johnson, S. G. (February 2005). "The design and implementation of FFTW3" (PDF). Proceedings of the IEEE. 93 (2): 216–231. CiteSeerX 10.1.1.66.3097. doi:10.1109/JPROC.2004.840301. S2CID 6644892.
  12. ^ Radu Lugina와 Martin Rinard, Language and Compilers for Parallel Computing 3장 34-48의 "분할정복 프로그램을 위한 불가침".컴퓨터 과학 강의 노트 2017 (Berlin: Springer, 2001)