두 문자열을 어떻게 일치시킬 수 있지만 동시에 X 문자 수가 일치하지 않을 수 있습니다. 오류 수는 제어 가능한 변수 여야합니다.
문자열에서 X 개의 문자 수가 일치하지 않지만 시퀀스에서 실행되는 문자 수에 대한 제한이 있어야합니다. 두 개의 문자열이 주어지면 5 문자를 다르게 할 수 있지만 행에서 2자를 넘지 않아야합니다.
이 두 문자열을 비교하기 위해 권장되는 알고리즘을 찾고 있거나 이미 알려진 해결책이 있습니다.
두 문자열을 어떻게 일치시킬 수 있지만 동시에 X 문자 수가 일치하지 않을 수 있습니다. 오류 수는 제어 가능한 변수 여야합니다.
문자열에서 X 개의 문자 수가 일치하지 않지만 시퀀스에서 실행되는 문자 수에 대한 제한이 있어야합니다. 두 개의 문자열이 주어지면 5 문자를 다르게 할 수 있지만 행에서 2자를 넘지 않아야합니다.
이 두 문자열을 비교하기 위해 권장되는 알고리즘을 찾고 있거나 이미 알려진 해결책이 있습니다.
답변:
대략적인 문자열 검색 시작 지점은 Levenshtein 거리 의 시작 지점입니다 . 이 알고리즘은 한 단어를 다른 단어로 변경하기 위해 단일 문자 편집 (삽입, 삭제 및 대체) 수를 계산합니다.
예를 들어 kitten
-> sitting
는 편집 거리가 3입니다.
이 알고리즘에는 특히 Damerau–Levenshtein 거리가 있으며 두 개의 인접한 문자 ( 'hte'에서 'the'까지의 DL 거리가 1이고 Levenshtein 거리가 2 임)를 바꿀 수 있으므로 종종 더 적합합니다. 철자 검사. 간격이 중요한 애플리케이션 (DNA 스트링)에 대한 다른 변형이 존재합니다.
Levenshtein 거리는 잘 알려져 있고 찾기가 너무 어렵지 않습니다 ( Oracle 에서 함수 로 구현을 추적하는 원인이 한 번있었습니다. 모든 데이터를 풀다운 한 다음 쿼리 코드 쪽을 실행하는 것보다 훨씬 빠릅니다). Rosettacode에는 Levenshtein 거리 의 수많은 구현 (54)이 있습니다 (일부 언어는 이것을 문자열 라이브러리의 일부로 사용합니다. Java를 수행하는 경우 apache commons lang을보십시오 ). Wikibooks 에는 31 개의 구현이 있으며 두 언어를 한 눈에 볼 때 동일한 언어에 대해 동일한 코드가 표시되지 않습니다.
이것이 작동하는 방식은 두 문자열 사이의 관계에 해당하는 행렬을 만드는 것입니다.
.kitten
.0123456
s1123456
i2212345
t3321234
t4432123
i5543223
n6654332
g7765443
.
행과 열은 그냥 '빈 문자열에서 각 문자를 삽입하여 목표 문자열로 얻을 수 있음을 나타냅니다. 이상적인 경우는 아니지만 알고리즘을 시드해야합니다.
값이 스팟과 동일하면 ( 'i'== 'i'), 값은 대각선까지 왼쪽의 값과 같습니다. 두 지점이 서로 다르면 ( 's'! = 'k') 값은 최소값입니다.
편집 거리 반환 값은 행렬의 오른쪽 아래에있는 값입니다.
오른쪽 하단에서 왼쪽 상단을 따라 가면 편집이 완료된 것을 볼 수 있습니다.
.kitten
.0. .
s.1 .
i 1 .
t 1 .
t 1.
i.....2
n 2
g......3
이것은 메모리를 많이 사용하는 접근 방법입니다. 전체 행렬을 작성하지 않음으로써 메모리 범위를 줄일 수 있습니다. 모든 알고리즘은 데이터의 서브 세트이며 이전 행을 저장하여 공간 에서 N*M
공간 으로 줄일 수 있습니다. 2*max(N,M)
열). 코드 프로젝트 에서는이를 수행하는 방법을 보여줍니다 (C # 코드를 사용하여 다운로드).