다이나믹 프로그래밍에 대한 사례 : 예 필요!


19

나는 한동안 동적 인 프로그래밍 작업을 해왔다. 동적 프로그래밍 재귀를 평가하는 정식 방법은 필요한 모든 값의 테이블을 만들고 행 단위로 채우는 것입니다. 예를 들어 Cormen, Leiserson et al : "Introduction to Algorithms" 를 참조하십시오 .

필자는 2 차원 (행 단위로 채움)으로 테이블 기반 계산 체계에 중점을두고 셀 종속성의 구조, 즉 다른 셀을 계산하기 전에 어떤 셀을 수행해야하는지 조사합니다. 셀 의존 하는 셀의 인덱스 세트 를 합니다 . 참고 사이클이 없어야합니다.I ΓΓ(i)iΓ

나는 계산되는 실제 함수에서 추상화하고 재귀 구조에 집중합니다. 공식적으로, 재귀 가 형식이있는 경우 동적 프로그래밍 이라고 생각합니다.d

d(i)=f(i,Γ~d(i))

로 , 및 사용하지 않고 일부 (계산 가능) 함수 비아 이외 .~ Γ d ( i ) = { ( j , d ( j ) ) jΓ d ( i ) } f d Γ di[0m]×[0n]Γ~d(i)={(j,d(j))jΓd(i)}fdΓ~d

의 입도 를 거친 영역 (현재 셀의 왼쪽, 왼쪽 위, 위쪽, 오른쪽 위 등)으로 제한 할 때 유효한 세 가지 경우 (대칭 및 회전까지)가 관찰됩니다. 테이블을 채울 수있는 방법을 알려주는 동적 프로그래밍 재귀 :Γd

동적 프로그래밍 셀 종속성의 세 가지 경우

빨간색 영역은 나타냅니다 . 사례 1과 2는 부분 집합을 인정하고 사례 3은 최악의 경우입니다 (인덱스 변환까지). 전체 빨간색 영역이 로 덮여 있어야하는 것은 아닙니다 . 테이블의 모든 빨간색 부분에있는 일부 셀은 빨간색으로 페인트하기에 충분합니다. 흰색 영역 에는 필요한 셀이 포함 되어 있지 않아야 합니다.ΓΓ

사례 1의 예는 편집 거리가장 긴 공통 서브 시퀀스 이며, 사례 2는 Bellman & FordCYK에 적용됩니다 . 덜 명백한 예로는 제안 된 사례에 맞게 회전 할 수 있기 때문에 행 (또는 열)이 아닌 대각선에서 작동하는 것입니다. 예를 들어 Joe의 답변 을 참조하십시오 .

그래도 사례 3에 대한 (자연적인) 예는 없습니다! 그래서 내 질문은 : 세 가지 동적 프로그래밍 재귀 / 문제의 예는 무엇입니까?


2
사례 3은 사례 1과 2를 가정합니다.
JeffE

외모에도 불구하고 그렇지 않습니다. 예를 들어, 사례 1 인스턴스는 왼쪽 상단 영역에 필수 셀을 가질 수 없지만 사례 3 인스턴스 왼쪽 상단 영역에 필수 셀을 가져야합니다. 설명을 명확하게하기 위해 편집했습니다.
Raphael

답변:


15

패턴에 전혀 맞지 않는 동적 프로그래밍 알고리즘의 다른 예가 많이 있습니다.

  • 가장 긴 서브 시퀀스 문제점은 1 차원 테이블 만 필요합니다.

  • 테이블에 3 개 이상의 차원이 필요한 자연 동적 프로그래밍 알고리즘이 몇 가지 있습니다. 예를 들어 : 비트 맵에서 최대 영역 흰색 사각형을 찾습니다. 자연 동적 프로그래밍 알고리즘은 3 차원 테이블을 사용합니다.

  • 그러나 가장 중요한 것은 동적 프로그래밍은 테이블에 관한 것이 아닙니다 . 긴장을 푸는 것입니다. 되풀이되는 되풀이가 정수 범위를 벗어나지 않기 때문에 중간 결과를 저장하는 데 사용되는 데이터 구조가 배열이 아닌 자연 동적 프로그래밍 알고리즘이 많이 있습니다. 두 가지 쉬운 예는 트리에서 가장 큰 독립 정점 세트를 찾고 두 트리의 가장 큰 공통 서브 트리를 찾는 것입니다. 더 복잡한 예는 Arora와 Mitchell의 유클리드 여행 세일즈맨 문제에 대한 근사 알고리즘입니다.(1+ϵ)


귀하의 답변에 감사드립니다. 그러나 나는 2 차원 문제와 표준 테이블 기반 계산 체계 (그 점을보다 명확하게하기 위해 편집 됨)로 질문을 명시 적으로 제한했습니다. 더 일반적인 프레임 워크는 알고 있지만 현재는 관심이 없습니다.
Raphael

9
그래,하지만 난 당신이 요점을 놓치고 있다고 생각합니다.
JeffE

많은 공감대가 있기 때문에 나는 이것을 분명히해야한다고 생각했습니다.이 게시물은 질문에 대답하지 않으며 실제로 시도조차하지 않습니다.
Raphael

2
@Raphael이 맞습니다. 내 "답변"은 답이 아니라 질문에 대한 비판이지만, 의견이 너무 길었습니다.
JeffE

3

Ackermann 기능 계산은이 정신에 있습니다. 을 계산하려면 큰 에 대해 및 를 알아야 합니다. 두 번째 좌표가 감소하거나 첫 번째 좌표가 감소하고 두 번째 좌표가 잠재적으로 증가합니다.A ( m , n - 1 ) A ( m - 1 , k ) kA(m,n)A(m,n1)A(m1,k)k

열의 수는 무한하며 계산은 일반적으로 암기와 함께 하향식으로 수행되므로 요구 사항에 이상적으로 적합하지 않지만 언급 할 가치가 있다고 생각합니다.


1
아니요, 에서와 같은 중첩은 실제로 동적 프로그래밍에 적합하지 않습니다. Hehe, 이것은 너무 이상합니다. 내 정의가 그런 경우를 제외하고 있는지 확인해야합니다. 비 원시적 재귀 DP, 오 마이 ...A(m1,A(m,n1))
라파엘

1
이 답변이 왜 다운 답을 받았는지 잘 모르겠습니다. Ackermann 함수는 동적 프로그래밍에 매우 적합합니다. 일반적으로 동일한 인수에 대해 반복적으로 계산되는 재귀 적으로 정의 된 함수는 동적 프로그래밍에 적합합니다. 이것을보기 위해서는 이것을 구현하고 실행 시간 만 비교하면됩니다. 일반적인 Ackermann 기능으로 계산하는 데 몇 년이 걸리는 것은 동적 프로그래밍 기능으로 몇 초가 걸릴 수 있습니다.
Jules

@ Jules : 표준 테이블 구성표의 문제점은 테이블 크기에 우선적으로 (기본 재귀) 경계를 모르는 것입니다. 물론 메모를 할 수는 있지만 일반적인 방법은 아닙니다. DP는 가능하지만 내 질문과 관련된 문제에는 맞지 않습니다.
Raphael

1
DP의 요구 사항이 테이블 크기에 우선 순위가 있다고 생각하지 않습니까? 실제로 JeffE가 언급했듯이 캐시는 전혀 테이블 일 필요는 없습니다. 모든 연관 데이터 구조 일 수 있습니다. DP는 실제로 매우 간단한 아이디어입니다. 재귀 적으로 정의 된 함수를 계산하려고하지만이 함수는 동일한 인수에서 반복적으로 호출됩니다. DP는 각 사례를 한 번만 계산할 수 있도록 캐시를 도입하는 최적화입니다. 두 경계 정수의 함수 라 할지라도 두 경우 모두에 맞는 함수가 많이 있습니다.
Jules

2

이것은 사례 3에 정확히 맞지 않지만 귀하의 사례 중 어느 것이 동적 프로그래밍을 가르치는 데 사용되는 매우 일반적인 문제를 모를 것인지는 모르겠습니다 : Matrix Chain Multiplication . 이 문제를 해결하기 위해 (그리고 다른 많은 것들은 단지 정식적인 것입니다) 행렬을 대각선 대신 대각선으로 채 웁니다.

따라서 규칙은 다음과 같습니다.

diagMatrix


1
이렇게 쓰여진 것은 실제로 어떤 경우에도 맞지 않습니다. 그러나 시계 방향으로 45도 회전하면 사례 2 (및 모든 묵시적 속성)가 표시됩니다. 대각선에서 모서리 방향으로 작동하는 다른 예제에서도 마찬가지입니다. 그러나 언급 해 주셔서 감사합니다!
Raphael

@Raphael 그것들이 동등하다는 것이 즉시 분명하지는 않습니다. 귀하의 질문에 언급하고 싶을 수도 있습니다.
Joe

0

나는 그 어리석은 예를 알고 있지만 간단한 반복 문제는

정사각 행렬의 숫자의 합을 구합니다

자격이 될 수 있습니다. 전통적인 "각 열의 각 행"종류는 귀하의 사례 3과 같습니다.


-1

이것은 당신이 찾고있는 검색 공간이 아니지만 도움이 될 수있는 내 머리 꼭대기에 대한 아이디어를 가지고 있습니다.

문제 :

n×nMxM

대답

다음과 같은 재귀 방식으로 해결할 수 있습니다.

우리는 n × n 행렬을 가지고 있습니다. 이라고하자k=1+n2xmk,kx<mk,kmi,jkinkjn1/4x>mk,k1/4. 따라서 첫 번째 반복 후 검색 공간의 크기는 이됩니다.34n2x(34)3n2


1
이것은 동적 프로그래밍의 인스턴스가 아닙니다.
Raphael
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.