지적한 바와 같이,이 문제는 일반적으로 알려진 편집 거리 문제 ( Levenshtein distance ) 와 유사합니다 . 예를 들어, 동적 시간 왜곡 거리 (마지막 요구 사항에서 복제 또는 "더듬기") 와 같은 공통점이 있습니다 .
동적 프로그래밍 단계
Levenshtein 거리와 Dynamic Time Warping Distance의 선을 따라 재귀 분해를 시도한 첫 번째 시도는 다음과 같았습니다 ( 및 y = y 1 ... y m ). d ( x , y ) 는 행 세트
분 { D ( X , Y 1 ... Y m - 1 ) + 1x = x1… x엔와이= y1… y미디엄디( x , y)
분 ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪디( x , y1… ym - 1) + 1디( x , y2… y미디엄) + 1디( x , y1… ym / 2) + 1디( x1… xn / 2, y) + 1디( x1…x엔,y) + 1디(x1…xn - 1, y1… ym - 1)만약 y 라면 = y1… ym / 2와이1… ym / 2만약 X = X1… xn / 2엑스1… xn / 2만약 y 라면 엔= y미디엄▻ 끝에 편지 추가▻ 처음에 글자 추가▻ 배가▻ 양분▻ 삭제el 마지막 엘트를 무시합니다.
여기서 마지막 옵션은 기본적으로 FOOX를 BARX로 변환하는 것은 FOO를 BAR로 변환하는 것과 같습니다. 즉,“끝에 문자 추가”옵션을 사용하여 말더듬 (중복) 효과와 한 시점에서 삭제를 달성 할 수 있습니다. 문제는 자동으로 당신이 추가 할 수 있다는 것입니다 임의의 문자열의 중간에 문자 뿐만 아니라 , 당신은 아마하지 않을 것을. (이 "동일한 마지막 요소 무시"는 임의의 위치에서 삭제 및 말더듬을 달성하는 표준 방법입니다. 그러나 임의의 삽입을 금지하고 양쪽 끝에 추가를 허용하지만 조금 까다 롭습니다 ...)
다른 사람이 어떻게 든 그것을 "구출"할 수있는 경우를 위해, 그리고이 방법을 아래 휴리스틱 솔루션에서 사용하기 때문에이 작업이 완전히 수행되지는 않더라도이 분류를 포함 시켰습니다.
(물론, 실제로 거리를 정의한 이와 같은 분석 결과가 나올 경우 메모를 추가하기 만하면 해결 방법이 필요합니다. 그러나 접두사 만 사용하는 것이 아니기 때문에 메모에 색인 만 사용할 수 있다고 생각하십시오. 각 호출마다 실제 수정 된 문자열을 저장해야 할 수도 있습니다. 문자열의 크기가 크면 커질 것입니다.)
휴리스틱 솔루션을 향한 단계
ㅏ※ ㅏ※
ㅏ※ㅏ※ㅏ※운영. (시간 / 우주 무역이 있습니다.)
그래서…
내 제안 된 솔루션의 효율성은 (1) 문자열의 길이와 (2) 알파벳의 크기에 상당히 의존하는 것처럼 보입니다. 둘 다 크지 않으면 작동 할 수 있습니다. 그건:
- 내 재귀 분해 및 동적 프로그래밍을 사용하여 거리에 대한 하한을 구현하십시오 (예 : 메모, 재귀 함수 사용).
- ㅏ※ㅏ※
나는 그것이 얼마나 효율적 일지를 보장 할 수는 없지만 정확 해야 하며 무차별 솔루션보다 훨씬 나을 것입니다.
다른 것이 없으면 추가 조사를위한 아이디어를 얻을 수 있기를 바랍니다.