가장 긴 공통 하위 문자열 문제

Longest common substring problem

컴퓨터 과학에서 가장 긴 공통의 하위 문자열 문제는 둘 이상의 하위 문자열인 가장 긴 줄을 찾는 것이다.그 문제에는 여러 가지 해결책이 있을 수 있다.애플리케이션에는 데이터 중복 제거와 표절 탐지가 포함된다.

문자열 "ABABC", "BABCA" 및 "ABCB"의 가장 긴 공통 하위 문자열A는 길이 3의 문자열 "ABC"이다.다른 일반적인 하위 문자열은 "A", "AB", "B", "BA", "BC" 및 "C"이다.

ABABC BABCA ABCBA

문제 정의

{\ m}의S S 길이 T 두 개의 문자열을 지정하면S 과 T }의 하위 문자열 중 가장 긴 문자열을 찾으십시오

일반화는 k-공통 하위 문자열 문제다.Given the set of strings , where and . Find for each , the longest strings which occur as substrings of at최소 k .

알고리즘

일반화 접미사 트리의 도움으로 + ){\ 시간에서 {\ }의 가장 긴 공통 서브스트링의 길이와 시작 위치를 찾을 수 있다.A faster algorithm can be achieved in the word RAM model of computation if the size of the input alphabet is in . In particular, this algorithm runs in O+) / log (+ ) 공간을 사용한다.[1]동적 프로그래밍을 통한 문제 해결 비용은 ( ) 입니다일반화된 문제에 대한 해결책은 ( 1+... + n 를 취한다. 공간 ·...· n ){\ 동적 프로그래밍의 k ){\ 시간을 일반화 접미사 트리로 가져간다.

접미사 트리

"ABAB", "BABA" 및 "ABBA" 문자열의 일반화 접미사 트리는 0, 1, 2로 번호가 매겨졌다.

문자열 집합의 가장 긴 공통 하위 문자열은 문자열의 일반화된 접미사 트리를 만든 다음 그 아래 하위 트리의 모든 문자열에서 리프 노드가 있는 가장 깊은 내부 노드를 찾는 방법으로 찾을 수 있다.오른쪽 그림은 고유한 문자열 터미네이터로 패딩된 'ABAB', 'BABA', 'ABBA' 문자열의 접미사 트리로, 'ABAB$0', 'BA$1', 'ABBA$2'가 된다."A", "B", "AB" 및 "BA"를 나타내는 노드는 모두 모든 문자열에서 0, 1, 2의 하위 잎을 가진다.

접미사 트리를 작성하려면 ) 시간이 소요된다(문자 크기가 일정한 경우).각 노드 아래에 어떤 문자열이 보이는지 알려주는 비트 벡터로 트리를 아래에서 위로 가로지르면 k-공통 하위 문자열 문제는 ) NK시간에 해결할 수 있다.접미사 트리가 일정 시간 가장 낮은 공통 조상 검색을 위해 준비되면{() 시간에 해결할 수 있다.[2]

동적 프로그래밍

다음은 동적 프로그래밍이 있는 두 문자열 사이에서 가장 긴 공통 하위 문자열 집합을 찾는 유사 코드:

기능 LCSubstr(S[1..r], T[1..n])L:=array(1..r, 1..n)z:=0물에 담그다:나를 위하여{}:=1..r j:=1..n 만약 S[나는])T[j]만약 내 정도 1또는 j-1L[나는, j]:=1 다른 L[나는, j]:)L[나는 1, j− 1−]+1만약 L[나는, j]>zz.:)L[i, j] ret := {S[i - z + 1..i]} L[i, j] = z ret := ret ∪ {S[i - z + 1..i]} 다른 L[i, j] := 0 반환 재시도

이 알고리즘은 ) 시간 단위로 실행된다.배열L접두사의 가장 긴 공통 부분을 저장하다.S[1..i]그리고T[1..j]어느 쪽이 그 위치에서 끝나는가. S[i],T[j], resp. 변수z지금까지 발견된 가장 긴 공통 하위 문자열의 길이를 유지하는 데 사용된다.세트ret길이가 긴 문자열 세트를 고정하는 데 사용됨z. 세트ret인덱스를 저장하기만 하면 효율적으로 저장할 수 있다.i, 즉, 가장 긴 공통 하위 문자열(z 크기)의 마지막 문자 입니다.S[i-z+1..i]따라서 모든 가장 긴 공통 기둥이 각각의 I에 대해ret,S[(ret[i]-z)..(ret[i])].

구현의 메모리 사용을 줄이기 위해 다음과 같은 방법을 사용할 수 있다.

  • 메모리를 저장하려면 DP 테이블의 마지막 행과 현재 행만 유지하십시오(( ,){\,n 대신{\ O(\O
  • 0이 아닌 값만 행에 저장하십시오.이것은 배열 대신 해시태블을 사용하여 할 수 있다.이것은 큰 알파벳에 유용하다.

참고 항목

참조

  1. ^ Charalampopoulos, Panagiotis, Kociumaka, 토머스, 피시스 솔론은 P.;Radoszewski Jakub(8월 2021년).Mutzel, 페트라, Pagh, 라스 머스, 허먼, Grzegorz(eds.).더 빨리 달려 알고리즘 가장 긴 공통 Substring.유럽 심포지엄 알고리즘에.라이프니츠 국제 담론 정보 과학(LIPIcs)에서.Vol204.슐로스 Dagstuhl.doi:10.4230/LIPIcs.ESA.2021.30.여기:정리 1, p.30:2.
  2. ^ Gusfield, Dan (1999) [1997]. Algorithms on Strings, Trees and Sequences: Computer Science and Computational Biology. USA: Cambridge University Press. ISBN 0-521-58519-8.

외부 링크