접미사 트리 및 시도. 차이점은 무엇입니까?


81

나는 Tries일반적으로 접두사 트리 및 Suffix Trees.
내가 코드를 발견하지만 Trie난에 대한 예를 찾을 수 없습니다 Suffix Tree. 또한 a를 빌드하는 코드가 a의 코드 Trie와 동일 하다는 느낌을받습니다. Suffix Tree전자의 경우 접두사를 저장하지만 후자의 접미사에 유일한 차이점이 있습니다.
이것이 사실입니까? 누구든지 내 머릿속에서 이것을 제거하도록 도울 수 있습니까? 예제 코드가 큰 도움이 될 것입니다!


1
TL; DR 문자열의 접미사 트리는 모든 접미사 의 패트리샤 트리 입니다. 유일한 특별한 점은 가장자리 레이블이 원래 문자열의 하위 문자열이므로 인덱스 쌍으로 표현할 수 있고 일정한 공간 만 차지한다는 것입니다. 이것이 선형 시간으로 구축 될 수있는 이유이기도합니다.
Niklas B.

답변:


66

접미사 트리는 문자열 자체를 trie에 추가하는 대신 해당 문자열의 가능한 모든 접미사를 추가하는 trie 위에 구축 된 데이터 구조로 볼 수 있습니다. 예를 들어 접미사 트리에서 banana 문자열을 인덱싱 하려면 다음 문자열로 trie를 빌드합니다.

banana
anana
nana
ana
na
a

이 작업이 완료되면 n-gram을 검색하고 색인화 된 문자열에 있는지 확인할 수 있습니다. 즉, n-gram 검색은 문자열의 가능한 모든 접미사에 대한 접두사 검색입니다.

접미사 트리를 만드는 가장 간단하고 느린 방법입니다. 이 데이터 구조에는 공간과 빌드 시간 중 하나 또는 둘 다를 향상시키는 더 멋진 변형이 많이 있습니다. 나는이 영역에 대한 개요를 제공하기에 충분히 정통하지 않지만 접미사 배열 이 나이 클래스 고급 데이터 구조 를 살펴 보는 것으로 시작할 수 있습니다 (강의 16 및 18).

답변 은 또한이 데이터 구조의 변형을 설명하는 훌륭한 작업을 수행합니다.


이것이 제가 생각했던 것입니다. 트라이는 접미사 트리를 구축하는 데 사용되기 때문에 대부분의 교과서는 시도 용 코드 만 제공합니다.하지만 이것이 최악의 경우 구현입니다.
Cratylus

@Cratylus 접미사 트리는 O (n ^ 2) 공간과 빌드 시간이 단순히 잘라 내지 않는 매우 큰 문자열 (예 : 셰익스피어의 모든 작업 인덱싱)에서 가장 유용합니다. 다행히도 그 경계는 상당히 낮출 수 있습니다.
Ze Blob

8

어떤 단어의 접미사를 넣는 Trie를 상상한다면 문자열의 하위 문자열을 매우 쉽게 쿼리 할 수 ​​있습니다. 이것이 접미사 트리의 기본 아이디어이며 기본적으로 "접미사 트리"입니다.

그러나이 순진한 접근 방식을 사용하면 크기 n의 문자열에 대해이 트리를 구성하면 O (n ^ 2)가되고 많은 메모리가 사용됩니다.

이 트리의 모든 항목은 동일한 문자열의 접미사이므로 많은 정보를 공유하므로보다 효율적으로 만들 수있는 최적화 된 알고리즘이 있습니다. 예를 들어 Ukkonen의 알고리즘을 사용하면 O (n) 시간 복잡성으로 온라인 접미사 트리를 만들 수 있습니다.


2
그래서 접미사 트리와 접미사 시도가 동일하다는 말입니까?
batman

1

차이점은 매우 간단합니다. 접미사 트리에는 접미사 트리보다 "더미"노드가 적습니다. 이러한 더미 노드는 트리에서 조회 작업을 증가시키는 단일 문자입니다.


0

Trie의 노드에는 더 짧은 컨텍스트에 대한 링크가 있지만 'Tree'에는 링크가 없습니다. Tree의 노드가 더 짧은 컨텍스트에 대한 링크를 얻으면 Trie; o)

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