스트링 절단에 대한 동적 프로그래밍 연습


16

나는이 에서 다음과 같은 문제를 연구하고 있다 .

특정 문자열 처리 언어는 문자열을 두 조각으로 나누는 기본 연산을 제공합니다. 이 작업에는 원본 문자열을 복사하는 작업이 포함되므로 절단 위치에 관계없이 길이가 n 인 문자열에 n 시간이 걸립니다. 이제 문자열을 여러 조각으로 나누고 싶다고 가정하십시오. 나누기 순서는 총 실행 시간에 영향을 줄 수 있습니다. 당신이 위치에 20 문자열을 차단하려는 경우 예를 들어, 및 다음 위치에서 첫 번째 컷을, 초래 총 비용 위치 (10)을하는 동안, 첫 번째의 더 나은 비용이 .310320+17=3720+10=30

컷 을 제공 하고 문자열을 조각 으로 절단하는 최소 비용을 찾는 동적 프로그래밍 알고리즘이 필요합니다 .mm+1

답변:


10

기본 아이디어는 다음과 같습니다. 모든 절단 위치를 우선 선택하고 각 부품을 재귀 적으로 해결하고 비용을 추가하고 최소값을 선택하십시오.

공식에서 :

mino(s,C)={|s|,|C|=1|s|+mincC[mino(s1,c,{cCc<c}) + mino(sc+1,|s|,{ccCc>c})], else

도포 유의 메모이 제이션을 이 재귀 것은 실제로 해결되는 동일한 세 개의 하위 삭감 결과 임의의 연속인가 쌍 순서를 전환 한대로 작동을 저장한다.


1

재귀 알고리즘을 먼저 찾은 다음 테이블로 바꾸는 것이 항상 좋습니다.

  1. f(C,n)
  2.    if (C = ) 0을 반환합니다;
  3.    그렇지 않으면
  4.      opt = 무한대;
  5.      각각 할cC
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.      return ;opt+n

그래서 당신은 물을 수 있습니다 : 테이블에 넣을 C의 하위 세트가 너무 많지 않습니까? '연속적인'하위 집합 만 필요하다는 것을 관찰하십시오. 그리고 그들 만 있습니다. (이유는 무엇입니까?) 또 다른 문제는 일부 항목이 에서 값을 변경한다는 것 입니다. 길이를 지정하는 대신 각 에서 시작과 끝을 표시하여이 문제를 해결할 수 있습니다 .(n2)fEf


0

이것은 다중 세트의 Quicksort와 매우 유사합니다. 컷 포인트가 중간에 가장 가까워지면 최적입니다.

멀티 세트 M = {1,1,1..1,2,2 ... 2, ...., m, m..m}의 뒤섞인 버전을 주면 런은 각 컷 포인트에서 끝납니다 중간에 가장 가까운 컷 피벗 으로 선택하여 최적의 퀵 정렬을 수행합니다 . 요소를 왼쪽 및 오른쪽 파티션으로 분할하는 작업은 문자열 분할과 동일한 방식으로 n 개의 작업을 수행하므로 Quicksort와 동일한 인수를 사용하여 중앙값이 최적임을 표시 할 수 있습니다. sk

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