두 단어 사이에서 가장 짧은 편집 횟수


11

두 단어가 입력으로 주어지면 한 단어를 다른 단어로 변환하는 데 필요한 최소 변경 수를 계산하는 데이터 구조와 알고리즘을 찾고 있습니다.

  • 사지 중 하나에 편지를 추가하십시오 (예 : AB-> ABC).
  • 전체 단어를 복제하고 연결합니다 (예 : ABC-> ABCABC).
  • 단어를 2 개로 자릅니다 (중복 이동의 이중, ABCABC-> ABC + ABC).
  • 문자 중 하나를 삭제하고 (예 : ABC-> AC)
  • 문자 중 하나를 반복하십시오 (예 : ABC-> ABBC).

예를 들어 ABC에서 BCBC 로의 최소 이동 순서는 ABC-> BC (삭제 A)-> BCBC (복제)입니다.

컴퓨터 과학에 대한 배경 지식이 없습니다. 아마도 이것은 잘 알려진 문제이지만 Google 검색에서 아무 것도 알려주지 않았습니다.

관련된 잘 정의 된 문제가 있습니까?

편집 : Anthony Labarre의 답변에서 제안한 것처럼 위에서 설명한 문제와 비슷한 포즈 순열 / 배열 문제에 대한 논문을 읽었습니다. 누구 든지이 문제에 대해 더 알고 있습니까? 관련이 있습니까?


1
아마도 en.wikipedia.org/wiki/String_metric 의 목록에는 해당 사항이 없으며 sourceforge.net/projects/simmetrics 에도 적용되지 않습니까?
András Salamon

나는 그들 모두를 모르지만이 방법의 목표의 대부분은 단일 문자 변경 만 허용하고 더 복잡한 움직임을 허용하지 않고 문자열을 정렬하는 것입니다.
cz3rk

1
전체 문자열 ABC-> ABCABC에 중복이 적용되므로 방향이 중요하지 않습니다. 그러나 반복 방향은 스테이 머처럼 오른쪽 순서로만 가능합니다.
cz3rk

2
입력 한 단어가 글자를 공유하지 않으면 왜 문제가 되나요? (사이의 빈 문자열이 있어야 A하고 Breinerpost의 순서 @ 인치)
Jeffε

2
"두 단어를 자르십시오"작업을 추가했습니다. w에 매핑하는 연산을 의미 합니까?
argentpepper

답변:


3

이 정확한 문제가 연구되었는지는 모르지만 Chaudhuri et al. 관련 탠덤 복제-무작위 손실 문제를 연구 했습니다. 문자열 대신 새로운 순열을 얻을 수 있습니다. (1), (2)를 적용하면 한 번의 작업이 수행됩니다.

각각의 작업에 주어진 무게에 따라 다른 변형이 정의 될 수 있으며, 그 논문에서 중복 세그먼트의 너비에 따라 다릅니다. 그들은 또한 전체 게놈 복제 와 비슷한 문제를 연구하는데 , 이것은 당신이 허용하는 복제의 종류입니다. 나는 문자열의 맥락 에서이 문제에 대한 연구에 대해 읽은 것을 기억하지 않지만 적어도 이것이 당신에게 검색의 출발점을 줄 수 있기를 바랍니다.


고마워, 나는 그들의 일을 볼 것이다. 두 문제 사이의 관계를 볼 수 있습니다.
cz3rk

2

지적한 바와 같이,이 문제는 일반적으로 알려진 편집 거리 문제 ( Levenshtein distance ) 와 유사합니다 . 예를 들어, 동적 시간 왜곡 거리 (마지막 요구 사항에서 복제 또는 "더듬기") 와 같은 공통점이 있습니다 .

동적 프로그래밍 단계

Levenshtein 거리와 Dynamic Time Warping Distance의 선을 따라 재귀 분해를 시도한 첫 번째 시도는 다음과 같았습니다 ( y = y 1 ... y m ). d ( x , y ) 는 행 세트 { D ( X , Y 1 ... Y m - 1 ) + 1엑스=엑스1엑스와이=와이1와이미디엄(엑스,와이)

{(엑스,와이1와이미디엄1)+1▻ 끝에 편지 추가(엑스,와이2와이미디엄)+1▻ 처음에 글자 추가(엑스,와이1와이미디엄/2)+1만약 와이=와이1와이미디엄/2와이1와이미디엄/2▻ 배가(엑스1엑스/2,와이)+1만약 엑스=엑스1엑스/2엑스1엑스/2▻ 반감(엑스1엑스,와이)+1▻ 삭제(엑스1엑스1,와이1와이미디엄1)만약 와이=와이미디엄el 마지막 엘트를 무시합니다.

여기서 마지막 옵션은 기본적으로 FOOX를 BARX로 변환하는 것은 FOO를 BAR로 변환하는 것과 같습니다. 즉,“끝에 문자 추가”옵션을 사용하여 말더듬 (중복) 효과와 한 시점에서 삭제를 달성 할 수 있습니다. 문제는 자동으로 당신이 추가 할 수 있다는 것입니다 임의의 문자열의 중간에 문자 뿐만 아니라 , 당신은 아마하지 않을 것을. (이 "동일한 마지막 요소 무시"는 임의의 위치에서 삭제 및 말더듬을 달성하는 표준 방법입니다. 그러나 임의의 삽입을 금지하고 양쪽 끝에 추가를 허용하지만 조금 까다 롭습니다 ...)

다른 사람이 어떻게 든 그것을 "구출"할 수있는 경우를 위해, 그리고이 방법을 아래 휴리스틱 솔루션에서 사용하기 때문에이 작업이 완전히 수행되지는 않더라도이 분류를 포함 시켰습니다.

(물론, 실제로 거리를 정의한 이와 같은 분석 결과가 나올 경우 메모를 추가하기 만하면 해결 방법이 필요합니다. 그러나 접두사 만 사용하는 것이 아니기 때문에 메모에 색인 만 사용할 수 있다고 생각하십시오. 각 호출마다 실제 수정 된 문자열을 저장해야 할 수도 있습니다. 문자열의 크기가 크면 커질 것입니다.)

휴리스틱 솔루션을 향한 단계

운영. (시간 / 우주 무역이 있습니다.)

그래서…

내 제안 된 솔루션의 효율성은 (1) 문자열의 길이와 (2) 알파벳의 크기에 상당히 의존하는 것처럼 보입니다. 둘 다 크지 않으면 작동 할 수 있습니다. 그건:

  • 내 재귀 분해 및 동적 프로그래밍을 사용하여 거리에 대한 하한을 구현하십시오 (예 : 메모, 재귀 함수 사용).

나는 그것이 얼마나 효율적 일지를 보장 할 수는 없지만 정확 해야 하며 무차별 솔루션보다 훨씬 나을 것입니다.

다른 것이 없으면 추가 조사를위한 아이디어를 얻을 수 있기를 바랍니다.


0

관련된 잘 정의 된 일부 문제는 시퀀스 정렬 문제입니다 . 복제 작업을 사용하지 않기 때문에 다릅니다. 정의 된 작업은 문자 삽입, 문자 삭제, 문자 변환입니다. 이 문제를 해결하기위한 일반적인 알고리즘은 Needleman-Wunsch 입니다.


나는 이것을 알고 있지만 실제로 정의 된 동작 세트로 작업하고 싶습니다. 내가 찾은 유일한 방법은 무차별 재귀 알고리즘을 사용하는 것입니다. 아주 좋지는 않았으며 단어의 크기가 커지면 계산 집약적이 될 수 있습니다.
cz3rk

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