두 문자열 사이 의 편집 (또는 Levenshtein) 거리는 한 문자열을 다른 문자열로 변환하는 데 필요한 최소 단일 문자 삽입, 삭제 및 대체입니다. 2 개의 스트링이 각각 길이 n을 갖는 경우, 이는 동적 프로그래밍에 의해 O (n ^ 2) 시간 내에 수행 될 수있는 것으로 잘 알려져있다. 다음 파이썬 코드는 두 개의 문자열이 계산 수행 s1
과 s2
.
def edit_distance(s1, s2):
l1 = len(s1)
l2 = len(s2)
matrix = [range(l1 + 1)] * (l2 + 1)
for zz in range(l2 + 1):
matrix[zz] = range(zz,zz + l1 + 1)
for zz in range(0,l2):
for sz in range(0,l1):
if s1[sz] == s2[zz]:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz])
else:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz] + 1)
return matrix[l2][l1]
이 작업에서는 편집 거리를 계산할 수 있지만 메모리 제한이 심해야합니다. 코드는 1000 개의 32 비트 정수를 포함하는 하나의 배열을 정의 할 수 있으며 이는 계산에 사용하는 유일한 임시 저장소입니다. 모든 변수와 데이터 구조가이 배열에 포함됩니다. 특히 최소 1,000,000 개의 숫자를 저장해야하므로 길이가 1000 인 문자열에 대해 위의 알고리즘을 구현할 수 없습니다. 언어에 자연스럽게 32 비트 정수 (예 : Python)가없는 경우 배열에 2 ^ 32-1보다 큰 숫자를 저장하지 않아야합니다.
해당 부분의 메모리 제한에 대해 걱정하지 않고 선택한 표준 라이브러리를 사용하여 데이터를 읽을 수 있습니다. 코드의 주요 부분에 대해 경쟁을 공평하게하기 위해 C 프로그래밍 언어의 기능과 동등한 기능 만 수행하고 외부 라이브러리를 사용할 수없는 작업 만 사용할 수 있습니다.
더 명확하게 말하면, 입력 데이터를 저장하거나 언어의 인터프리터, JVM 등에서 사용하는 메모리는 한계에 포함되지 않으며 디스크에 아무것도 쓰지 않을 수 있습니다. 더 많은 작업 공간을 확보하기 위해 재사용 할 수 없도록 메모리에있을 때 입력 데이터가 읽기 전용이라고 가정해야합니다.
무엇을 구현해야합니까?
코드는 다음 형식의 파일로 읽어야합니다. 세 줄이 있습니다. 첫 번째 줄은 실제 편집 거리입니다. 두 번째는 문자열 1이고 세 번째는 문자열 2입니다. https://bpaste.net/show/6905001d52e8 의 샘플 데이터를 사용하여 테스트합니다. 여기서 문자열의 길이는 10,000이지만이 데이터에 특화되어서는 안됩니다. 두 문자열 사이에서 찾을 수있는 가장 작은 편집 거리를 출력해야합니다.
또한 편집 거리가 실제로 유효한 편집 세트에서 비롯된 것임을 증명해야합니다. 코드에는 더 많은 메모리를 사용할 수있는 모드로 전환하고 (원하는만큼) 편집 거리를 제공하는 편집 작업을 출력하는 스위치가 있어야합니다.
점수
당신의 점수는 (optimal edit distance/divided by the edit distance you find) * 100
입니다. 일을 시작하려면 두 문자열 사이의 불일치 수를 세면 점수를 얻을 수 있습니다.
Linux에서 자유롭게 사용할 수 있고 설치하기 쉬운 원하는 언어를 사용할 수 있습니다.
타이 브레이크
타이-브레이크의 경우 Linux 시스템에서 코드를 실행하면 가장 빠른 코드가 승리합니다.
{ uint32_t foo[1000]; for (foo[0] = 0; foo[0] < 5; ++foo[0]) printf("%d ", foo[0]); }
32 비트 정수 배열이 호출된다고 가정합니다 foo
.
for(int i=0;i<=5;i++)
그것은에 데이터를 저장 있기 때문에 허용i
?