선형 시간의 Suffix Array Construction
suffix array는 문자열 의 개의 모든 접미사를 사전순으로 정렬한 배열로, 시간과 메모리에 구할 수 있다. suffix array를 로그 시간에 구하는 방법을 안다면, 이해하기 어렵지 않을 것 같다.
길이 의 문자열의 suffix array를 구하는 데 걸리는 시간을 라고 하자.
일단 에 있는 모든 문자보다 작은 문자 를 잡아서 뒤에 3개 붙이고, ()를 로 정의하자.
일단 들을 정렬해서 가 각각 사전순으로 몇 번째인지 구하자. radix sort를 사용하면 에 정렬할 수 있다.
각각의 를 하나의 문자로 보고 새로운 문자열 를 정의하자.
이므로, 의 suffix array를 구하는 데는 의 시간이 걸린다.
의 suffix array를 이용하면, ()들을 모두 정렬할 수 있다.
이제 ()들을 모두 정렬하자. 라면 첫 글자 기준으로 정렬하면 된다. 라면 의 사전순 순서를 알고 있으므로 그걸 이용해서 정렬하면 된다. radix sort를 사용하면 에 정렬할 수 있다.
마지막으로 정렬된 두 배열을 합치면 된다. 두 배열이 모두 정렬되어 있으므로 두 원소를 에 비교할 수 있다면 에 merge가 가능하다.
, 가 mod 3으로 다르다면, 가 존재하여 , 가 모두 mod 3으로 0이 아니다. 따라서 앞의 2개 이하의 원소만 하나씩 비교하면, , 은 이미 정렬되어 있으므로 상수 시간에 바로 비교할 수 있다.
모든 시간을 합하면 이고, 등비수열의 합이므로 이 된다.
댓글
0개아직 댓글이 없습니다.