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


13

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


답변:


9

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

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


그러면 메모리의 공간 복잡성이 입력 데이터보다 클 때마다 (아마도> O (N)) 동적 프로그래밍이 도움이되지 않을 가능성이 있습니다. 즉, 가끔 같은 상황이 발생합니다.
edA-qa mort-ora-y

1
Memoisation! = 동적 프로그래밍!
Raphael

1
나는 우리가 그런 말을하지 않는다고 생각하지만, 문제는 시간 복잡성을 줄이는 것을 의미합니다. 독자적인 동적 프로그래밍은 단순히 문제를 분할합니다. 동적 프로그래밍 + 메모는 가능한 시간 복잡성을 개선하는 일반적인 방법 입니다.
edA-qa mort-ora-y

@ edA-qamort-ora-y : 그렇습니다. OP가 개념을 혼동하거나 혼동하기 때문에 명확하게 지적하는 것이 중요하다고 생각합니다.
Raphael

8

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

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

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

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

ff(n)f(n+1)

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

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


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

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

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

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


동적 프로그래밍이 시간을 더 복잡하게 만드는 경우가 있지만 메모가 도움이되지 않는 경우 (또는 적어도 그다지 많지 않음)가 있습니까? 예가 있습니까? 또는 동적 프로그래밍이 메모가있는 일부 문제에만 유용하다고 말하는 것입니까?
svick

@svick : 동적 프로그래밍 속도를하지 않는 것도 민주당의 재귀가 메모이 제이션으로 평가 된 경우에만, 그 자체를 ((보통이다)의 경우를!). 다시 : DP는 재귀 측면에서 문제 를 모델링하는 방법 이며, 메모 화는 (DP 여부에 관계없이) 적절한 재귀 알고리즘의 속도를 높이는 기술 입니다. 직접 비교하는 것은 이치에 맞지 않습니다. 물론 메모를 적용해야하므로 문제를 DP로 모델링하려고 시도하므로 순진한 접근 방식보다 더 빨리 해결할 수 있습니다. 그러나 DP 관점이 항상 가장 효율적인 알고리즘으로 이어지지는 않습니다.
Raphael

사용 가능한 프로세서가 여러 개인 경우 동적 프로그래밍은 부품을 병렬화 할 수 있으므로 실제 성능을 크게 향상시킵니다. 실제로 시간 복잡성을 변경하지는 않습니다.
edA-qa mort-ora-y

@ edA-qamort-ora-y : 그것은 모든 재귀 에 해당 됩니다. 그러나 메모리 속도가 프로세서 경계보다 효율적이지 않기 때문에 이것이 좋은 속도 향상을 가져 오는지 확실하지 않습니다.
Raphael

수정 : 평가 DP 재발은 순진한 힘보다 여전히 순식간에 훨씬 빠를 수있다. cf. 여기 .
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.