재귀 알고리즘의 시간 복잡성을 줄이기 위해 동적 프로그래밍을 언제 사용할 수 있습니까? 복잡성을 줄이는

동적 프로그래밍은 재귀 알고리즘을 수행하는 데 필요한 시간을 줄일 수 있습니다. 동적 프로그래밍이 알고리즘의 시간 복잡성을 줄이는 데 도움이 될 수 있음을 알고 있습니다. 재귀 알고리즘에 의해 만족된다면 동적 프로그래밍을 사용하는 것이 알고리즘의 시간 복잡성을 감소시킬 것이라는 일반적인 조건인가? 동적 프로그래밍은 언제 사용해야합니까?



답변

동적 프로그래밍은 재귀 알고리즘이 동일한 상황 (입력 매개 변수)에 여러 번 도달하는 것을 발견하는 데 유용합니다. 재귀 알고리즘에서 memoization으로 알려진 동적 프로그래밍으로의 일반적인 변환이 있으며 , 여기에는 재귀 프로 시저에서 계산 한 모든 결과를 저장하는 테이블이 있습니다. 이미 사용 된 입력 세트에서 재귀 프로 시저를 호출하면 결과가 테이블에서 페치됩니다. 이것은 재귀 피보나치를 반복 피보나치로 줄입니다.

보다 구체적인 최적화를 적용하면 동적 프로그래밍이 더욱 스마트해질 수 있습니다. 예를 들어, 주어진 시간에 전체 테이블을 메모리에 저장할 필요가없는 경우가 있습니다.


답변

재귀 알고리즘의 속도를 높이 려는 경우 메모 로 충분할 수 있습니다. 이것은 함수 호출 결과를 저장하는 기법으로, 동일한 매개 변수를 가진 향후 호출에서 결과를 재사용 할 수 있습니다. 이것은 당신의 기능에 해당하는 경우에만 적용됩니다.

  • 부작용이 없으며
  • 매개 변수에만 의존합니다 (즉, 일부 상태에는 의존하지 않음).

함수가 동일한 매개 변수로 반복해서 호출되는 경우 시간이 절약됩니다. 인기있는 예는 피보나치 수의 재귀 적 정의를 포함합니다.

f(0)=0f(1)=1f(n+2)=f(n+1)+f(n), n≥0

f

f(n)

f(n+1)

대조적으로, 메모 정렬은 병합 정렬과 같은 알고리즘에는 쓸모가 없습니다. 일반적으로 부분 목록이 거의없고 부분 목록이 동일하고 동등성 검사가 비쌉니다 (정렬은 약간 더 비쌉니다!).

실제 구현에서 결과를 저장하는 방법은 성능으로 가져옵니다. 해시 테이블을 사용하는 것이 당연한 선택 일 수 있지만 지역성이 손상 될 수 있습니다. 매개 변수가 음수가 아닌 정수인 경우 배열은 자연 선택이지만 일부 항목 만 사용하면 메모리 오버 헤드가 커질 수 있습니다. 따라서 메모는 효과와 비용 사이의 균형입니다. 지불 여부는 특정 시나리오에 따라 다릅니다.


동적 프로그래밍 은 완전히 다른 짐승입니다. 그것은 재산의 문제에 적용 할 수 있습니다

  • 하위 문제 (아마도 여러 가지 방법으로)로 분할 될 수 있습니다.
  • 이러한 하위 문제는 독립적으로 해결할 수 있습니다.
  • 이러한 하위 문제의 (최적) 솔루션은 원래 문제의 (최적) 솔루션과 결합 될 수 있습니다.
  • 하위 문제는 동일한 속성을 갖습니다 (또는 사소합니다).

이것은 사람들이 Bellman ‘s Principle of Optimality를 호출 할 때 일반적으로 암시 적으로 암시됩니다 .

자, 이것은 특정 재귀로 표현 될 수있는 일련 의 문제 만을 설명합니다 . 메모가 큰 효과에 적용될 수 있기 때문에 (종종) 효율적으로 평가할 수있다 (위 참조). 일반적으로 작은 문제는 더 큰 문제의 일부로 발생합니다. 자주 사용되는 예로는 편집 거리Bellman-Ford 알고리즘이 있습니다.