나는 Ukkonen 알고리즘의 점근 적 실행 시간에 대한 문제에 관심이 있습니다. 아마도 선형 (?) 시간에 접미사 트리 를 구성하는 가장 인기있는 알고리즘 일 것 입니다.
Dan Gusfield (섹션 6.5.1)의 "문자열, 나무 및 시퀀스에 대한 알고리즘"책에서 인용 한 내용은 다음과 같습니다.
"... Aho-Corasick, Weiner, Ukkonen 및 McCreight 알고리즘은 모두 공간이 필요하거나 O ( m ) 시간 범위가 최소 O ( m log m ) 및 O 로 대체되어야합니다. ( m log | Σ | ".
[ 은 문자열 길이이며 는 알파벳 크기입니다]
왜 그런지 이해가되지 않습니다.
- 공간 : 음 , 우리가 크기 배열을 사용하여 노드에서 분기를 나타내는 경우 실제로는 Θ ( m | Σ | ) 공간 사용으로 끝납니다 . 그러나 내가 볼 수있는 한 해시 테이블 (예 : Python의 사전)을 사용하여 분기를 저장할 수도 있습니다. 그런 다음 모든 해시 테이블에 Θ ( m ) 포인터 만 저장하고 ( 트리에 Θ ( m ) 가장자리 가 있기 때문에 ) 여전히 O 의 자식 노드에 액세스 할 수 있습니다 배열을 사용할 때만 큼 빠릅니다.
- 시간 : 위에서 언급했듯이 해시 테이블을 사용하면 시간 에 모든 노드의 발신 분기에 액세스 할 수 있습니다 . Ukkonen의 알고리즘에는 O ( m ) 작업 (자식 노드 액세스 포함 )이 필요하므로 전체 실행 시간도 O ( m )이 됩니다.
내 결론에 왜 틀린지, 알파벳에 대한 Ukkonen 알고리즘의 의존성에 대해 Gusfield가 왜 옳은지에 대한 힌트를 주셔서 감사합니다.