겹치는 하위 문제

Overlapping subproblems

컴퓨터 과학에서 문제가 여러 번 재사용되는 하위 문제로 분해될 수 있거나 문제에 대한 재귀적 알고리즘이 항상 새로운 하위 문제를 발생시키지 않고 반복적으로 동일한 하위 문제를 해결할 수 있다면 하위 문제가 중복된다고 한다.[1][2] [3]

예를 들어, 피보나치 수열의 계산 문제는 중복되는 하위 문제를 나타낸다. n번째 피보나치 숫자 F(n)를 계산하는 문제는 F(n - 1)와 F(n - 2)를 계산하는 하위 문제로 분해한 다음 두 가지를 더하면 된다. 연산 F(n - 1)의 하위 문제 자체가 연산 F(n - 2)를 수반하는 하위 문제로 분해될 수 있다. 따라서 F(n - 2)의 연산은 재사용되며, 피보나치 수열은 따라서 중복되는 하위 문제를 나타낸다.

그러한 문제에 대한 순진한 재귀적 접근은 일반적으로 기하급수적인 복잡성으로 인해 실패한다. 문제가 최적의 하부구조 속성도 공유한다면 동적 프로그래밍은 문제를 해결하는 좋은 방법이다.

피보나치 시퀀스 예제(C)

다음 C 코드를 고려하십시오.

#include <stdio.h>  #N 5호 정의  정태의 인트로 fibmem[N];  인트로 피보나치(인트로 n) {  인트로 r = 1;  만일 (n > 2) {   r = 피보나치(n - 1) + 피보나치(n - 2);  }  fibmem[n - 1] = r;  돌아오다 r; }  공허하게 하다 프린트피보나치() {     인트로 i;     을 위해 (i = 1; i <= N; i++) {         활자화하다("fibonacci(%d): %d\n", i, fibmem[i - 1]);     } }  인트로 본래의(공허하게 하다) {     피보나치(N);  프린트피보나치();  돌아오다 0; }  /* 출력:     피보나치(1): 1     피보나치(2): 1     피보나치(3): 2     피보나치(4): 3     피보나치(5): 5 */ 

실행 시 fibonacci 함수는 이 다이어그램으로 시각화할 수 있는 패턴을 따라 시퀀스에 있는 일부 숫자의 값을 여러 번 계산한다.

f(5) = f(4) + f(3) = 5 f(3) = f(2) + f(1) = 2 f(1) = 1 f(2) = 1 f(4) = 1 f(3) = f(2) = 3 f(2) = 1 f(2) = 1 f(2) = f(2) + f(1) = 2                                                           f(1) = 1 f(2) = 1 

그러나 메모화를 이용하여 변경하면 된다. fibonacci 을 이용하다 fibMem 다음과 같다:

인트로 피보나치(인트로 n) {  인트로 r = 1;  만일 (fibmem[n - 1] != 0) {   r = fibmem[n - 1];  } 다른 {   만일 (n > 2) {    r = 피보나치(n - 1) + 피보나치(n - 2);   }   fibmem[n - 1] = r;  }  돌아오다 r; } 

이것은 훨씬 더 효율적이다. 왜냐하면 만약 그 가치가 r 이미 어느 정도 계산되어 있다. n 에 저장되어 있다. fibMem[n - 1], 함수는 더 많은 재귀 함수 호출을 하기 보다는 저장된 값을 반환할 수 있다. 따라서 이 다이어그램으로 시각화할 수 있는 패턴이 생성된다.

f(5) = f(4) + f(3) = 5 f(4) = f(3) + f(2) = 3 f(3) = f(2) = f(1) = 2 f(1) = 1 f(2) = 1 

이 차이는 다음과 같이 크게 보이지 않을 수 있다. N 5의 값이지만 가치가 증가함에 따라 원본의 복잡성 fibonacci 기능은 기하급수적으로 증가하는 반면, 개정판은 더 선형적으로 증가한다.

참고 항목

참조

  1. ^ 알고리즘 소개, 2차 개정 (코멘, Leiserson, Rivest 및 Stein) 2001, 페이지 327. ISBN0-262-03293-7.
  2. ^ 알고리즘 소개, 3차 개정판 (Cormen, Leiserson, Rivest 및 Stein) 2014, 페이지 384. ISBN 9780262033848.
  3. ^ 동적 프로그래밍: 중첩 하위 문제, 최적 하위 구조, MIT 비디오.