접미사 트리를 사용하여 모든 공통 하위 문자열을 찾을 수 있습니까?


10

문자열 시퀀스를 비교하기 위해 접미사 트리를 사용하려고합니다. 접미사 트리를 사용하여 가장 긴 공통 하위 문자열 문제에 대한 구현 / 이론을 발견했습니다. 그러나 내가 찾고있는 것은 관련 문제- "모든 공통 하위 문자열"에 대한 토론입니다. 특히, 나는 가장 긴 공통 부분 문자열을 먼저 찾은 다음 이미 찾은 lcs 색인을 포함하지 않는 다음으로 가장 긴 공통 부분 문자열을 찾은 다음 최소 길이까지 문제가 있습니다. 이 문제는 두 시퀀스에 대해 GST (Generalized suffix tree)를 한 번만 구성하여 해결할 수 있습니다. LCS를 찾고 제거 할 때마다 GST를 반복적으로 구성하여 해결할 수 있다는 것을 알고 있습니다. 그러나 GST에서 한 번만 구성되는 깔끔한 트릭이 누락되어 있는지 궁금합니다.


흥미로운 질문입니다. 문제는 우리가 이고 β 가 LCS wrt T 이면 접미사 트리 (또는 접미사 배열 등)에서 β 를 쉽게 "제거"할 수 없다는 것 입니다. 첫 번째 단계 후에 S ' = α $ γ 와 같은 것을 원합니다 . S=αβγβTβS=α$γ
Dmytro Korduban

답변:


3

예, 접미사 트리를 사용하여 모든 공통 하위 문자열을 찾을 수 있습니다. 대신 접미사 배열을 사용한다고 말하지만 이미 접미사 트리가 있으면 접미사 트리에서 접미사 배열을 작성하는 데 DFS에서 선형 시간이 걸립니다. 나머지 답변은 접미사 배열로 작업한다고 가정합니다.

S=s1,...,snS0nn+1S

LCPsLCPslcp[k]ksa[k]sa[k1]두 번째 인스턴스의 시작 색인이됩니다. 길이는 물론 lcp 배열의 값입니다.


3

STSTvlcs(v)rlcs(r)ST

vkkk<lcs(v)klcs(v)우리는 사소한 뿌리를 가진 하위 트리에 관심이 없기 때문에 완료되었습니다.

ST

몇 가지 기술이 있지만 일반적인 아이디어는 효과가 있습니다.


0

연결된 텍스트 S $ T로 시작하십시오 . 여기서 $는 * 또는 T 어디에도 없습니다 . 이 텍스트로부터 접미사 트리 / 배열을 구축합니다. 이제이 접미사 데이터 구조를 순회하여 모든 올바른 최대 반복을 수집하는 것이 쉽습니다. 왼쪽 컨텍스트를 검사하여 왼쪽이 아닌 최대 반복을 필터링하십시오. 이 왼쪽 필터링은 Abouelhoda 등에서와 같이 Burrows-Wheeler 테이블을 사용하여 구현 될 수 있지만 이것이 필요하다고는 생각하지 않습니다. S 에서만 또는 T 에서만 반복 반복이 시점에서 olso를 제거해야합니다. 제거되지 않은 반복은 우선 순위 길이로 정의 된 우선 순위 큐에 놓입니다. 순회 후에 기록 된 반복이 우선 순위에서 제거되면 최종 필터링 (하위 문자열 포함)이 수행 될 수 있습니다. 그러나 최대 문구를 사용하면이 필터링이 거의 필요하지 않다고 생각합니다.

이 알고리즘은 내 자신의 발명품입니다. 나는 그것을 매우 영리한 것으로 분류하지는 않지만 작동해야합니다.


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