배열없는 메모


14

Cormen et al.의 알고리즘 소개 , 섹션 15.3 동적 프로그래밍 요소는 다음과 같이 메모를 설명합니다.

메모 된 재귀 알고리즘은 각 하위 문제에 대한 솔루션에 대한 테이블의 항목을 유지합니다. 각 테이블 항목에는 처음에 항목이 아직 채워지지 않았 음을 나타내는 특수 값이 포함되어 있습니다. 재귀 알고리즘이 전개 될 때 하위 문제가 처음 발생하면 해당 솔루션이 계산 된 다음 테이블에 저장됩니다. 이후에이 하위 문제가 발생할 때마다 테이블에 저장된 값을 찾아서 반환합니다.

그리고 각주로 추가됩니다.

이 방법은 가능한 모든 하위 문제 매개 변수 집합을 알고 테이블 위치와 하위 문제 간의 관계를 설정했음을 전제로합니다. 보다 일반적인 또 다른 방법은 하위 문제 매개 변수를 키로 사용하여 해싱을 사용하여 메모하는 것입니다.

메모 된 값을 (다차원) 배열이 아닌 사전에 저장해야하는 잘 알려진 DP 문제가 있습니까?


배경 : 이것이 사용된다면,이 질문의 이유는 동적 프로그래밍을 본 사람들에게 (자체 균형) 이진 검색 트리의 개념에 동기를 부여하려고하기 때문입니다.


내가 사용하는 실제 소프트웨어에서 메모리를 사용하면 상대적으로 비싼 기능 ( exp , log 또는 pow 와 같은 )을 코드의 여러 곳에서 호출 할 수 있다는 사실을 활용할 수 있습니다. 각 특정 코드 위치에서 동일한 값. 이 경우 "사전"은 코드 위치 별 변수에 저장된 단일 값일 수 있습니다.
마이크 던 라비

답변:


5

더 좋은 예가 있을지 모르지만 여기에는 내 머리 꼭대기에있는 예가 있습니다.

두 문자열 사이의 편집 거리를 확인하고 싶다고 가정 해 봅시다. 에스, 이다 그렇다면 편집 거리를 계산하십시오. 표준 동적 프로그래밍 알고리즘을 사용하여 편집 거리를 계산할 수 있지만 편집 거리가 알려진 모든 위치에서 계산을 "제거"(재귀 중지) 할 수 있습니다.>. 이것은 아마도 전체 테이블을 채울 필요가 없다는 것을 의미합니다. 일부 항목 만 작성하면됩니다. 따라서 사전을 사용하면 성능이 향상 될 수 있습니다.


3

두 가지 예를 제공하고 싶습니다.

0-1 배낭 문제

0-1 배낭 문제 (여기서 W 는 배낭의 용량이고 N 은 품목의 양임)의 경우에는 체계적인 상향식 열거 대신 하향식 동적 프로그래밍을 메모와 함께 사용하는 것이 더 나은 경우가 있습니다. 크기 WxN 의 전체 2D 어레이의 크기 (특히 배낭 W 의 용량 이 크지 만 허용되는 품목 무게 조합 조합의 카디널리티 가 W 보다 훨씬 작은 경우 ).

이 경우에, 메모리의 경제성을 위해, 2D 어레이 대신에 메모를 위해 사전을 사용하도록 선택할 수있다.

얼리 파싱 알고리즘

Earley 구문 분석 알고리즘 은 컨텍스트가없는 문법에 속하는 명령문 구문 분석에 사용할 수 있습니다. 상향식 DP 접근 방식을 기반으로하고 메모를 위해 2D 테이블을 사용 하는 CYK 알고리즘 과 달리 Earley 파서는 메모를 위해 구문 분석 차트 와 함께 하향식 접근을 사용합니다 .

구문 분석 차트에는 부분적으로 구문 분석 된 문법 생산이 포함됩니다 (예 : 생산 X → AB가 주어지고이 생산 의 A 부분을 성공적으로 일치시킨 후 부분적으로 일치하는 생산을 구문 분석 차트에 저장합니다 : X → A • B , 여기서 점은 이미 일치하는 부분).

구문 분석 차트 내의 열 양은 토큰 양과 같습니다. 그러나 일반적으로 열당 부분적으로 구문 분석 된 문법 생성량을 계산하는 것은 매우 까다로울 수 있습니다 (문법 및 특정 토큰 순서에 따라 다름).

따라서 사전 데이터 구조를 기반으로 구문 분석 차트를 구현하는 것이 더 편리합니다.

자연어 처리 도메인에서는 일반적으로 Earley 파서가 문법에 Chomsky 정규 형식 을 필요로하지 않기 때문에보다 편리한 선택입니다 (CYK에는 이러한 요구 사항이 있음).


0

경쟁 프로그래밍 경험에서 해시 테이블 (Python dict또는 이와 유사한)을 사용하는 것이 배열을 사용하는 것보다 종종 편리합니다. 해시 가능한 데이터 유형은 문자열, 세트 ( frozensetPython의 경우) 또는 튜플과 같은 키로 사용할 수 있기 때문입니다.(string, int) . 배열을 사용하는 경우 모든 키를 수동으로 정수 (0부터 시작)로 변환해야합니다.이 작업은 추가 작업이 필요하며 미리 키의 공간을 모르면 소스 메모로 사용하지 못할 수 있습니다. 따라서 사전은 배열보다 일반적입니다.

물론 배열을 사용하여 벗어날 수 있다면 해시를 반복적으로 계산하지 않기 때문에 더 빠를 것입니다 (반면 전체 배열을 먼저 초기화해야하므로 시간과 메모리가 필요함).하지만 코드를 작성하는 데 시간이 더 걸릴 수 있습니다 모든 키를 정수로 변환하는 추가 작업을 수행해야하기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.