답변:
동적 프로그래밍은 재귀 알고리즘이 동일한 상황 (입력 매개 변수)에 여러 번 도달하는 것을 발견하는 데 유용합니다. 재귀 알고리즘에서 memoization으로 알려진 동적 프로그래밍으로의 일반적인 변환이 있으며 , 여기에는 재귀 프로 시저에서 계산 한 모든 결과를 저장하는 테이블이 있습니다. 이미 사용 된 입력 세트에서 재귀 프로 시저를 호출하면 결과가 테이블에서 페치됩니다. 이것은 재귀 피보나치를 반복 피보나치로 줄입니다.
보다 구체적인 최적화를 적용하면 동적 프로그래밍이 더욱 스마트해질 수 있습니다. 예를 들어, 주어진 시간에 전체 테이블을 메모리에 저장할 필요가없는 경우가 있습니다.
재귀 알고리즘의 속도를 높이 려는 경우 메모 로 충분할 수 있습니다. 이것은 함수 호출 결과를 저장하는 기법으로, 동일한 매개 변수를 가진 향후 호출에서 결과를 재사용 할 수 있습니다. 이것은 당신의 기능에 해당하는 경우에만 적용됩니다.
함수가 동일한 매개 변수로 반복해서 호출되는 경우 시간이 절약됩니다. 인기있는 예는 피보나치 수의 재귀 적 정의를 포함합니다.
대조적으로, 메모 정렬은 병합 정렬과 같은 알고리즘에는 쓸모가 없습니다. 일반적으로 부분 목록이 거의없고 부분 목록이 동일하고 동등성 검사가 비쌉니다 (정렬은 약간 더 비쌉니다!).
실제 구현에서 결과를 저장하는 방법은 성능으로 가져옵니다. 해시 테이블을 사용하는 것이 당연한 선택 일 수 있지만 지역성이 손상 될 수 있습니다. 매개 변수가 음수가 아닌 정수인 경우 배열은 자연 선택이지만 일부 항목 만 사용하면 메모리 오버 헤드가 커질 수 있습니다. 따라서 메모는 효과와 비용 사이의 균형입니다. 지불 여부는 특정 시나리오에 따라 다릅니다.
동적 프로그래밍 은 완전히 다른 짐승입니다. 그것은 재산의 문제에 적용 할 수 있습니다
이것은 사람들이 Bellman 's Principle of Optimality를 호출 할 때 일반적으로 암시 적으로 암시됩니다 .
자, 이것은 특정 재귀로 표현 될 수있는 일련 의 문제 만을 설명합니다 . 메모가 큰 효과에 적용될 수 있기 때문에 (종종) 효율적으로 평가할 수있다 (위 참조). 일반적으로 작은 문제는 더 큰 문제의 일부로 발생합니다. 자주 사용되는 예로는 편집 거리 및 Bellman-Ford 알고리즘이 있습니다.