알고리즘/알고리즘 노트

[문자열]

산을좋아한라쯔 2016. 7. 28. 09:06
반응형

1. 접미사 배열

2. KMP


----------------------------

1. 접미사 배열

- 한 문자열에서, 나올 수 있는 모든 가능성 있는 접미사를 사전순으로 정렬해 놓은 배열

- 큰 문장이 있을 때 '찾기' 기능 구현에 적합. <- 찾으려는 문자열은, 항상 접미사 배열의 접두사

- 접미사배열을 만드는 데는, 일반적인 소팅을 하면 O(N2longN) : 소팅하는데 NlongN. 그리고 각 소팅마다 문자열 비교하는데 N

char str[1005]

string suffix[1005]


scanf("%s",A+1)

for(int i=1;i<=n;++i) suffix[i] = &str[i];

sort(suffix+1, suffix+n+1)

- 가장 빠른 알고리즘은 O(N)가능-> 너무 복잡. 

- 맨버 마이어스 알고리즘을 쓰면 O(Nlg2N) 가능


2. KMP

- pi[] 테이블 만들고, 이 테이블을 이용해서 문자열 매칭을 효율적으로 수행


*문자열 A에서, B문자열이 들어있는지 찾아내려함.

         scanf("%s", A + 1);

         scanf("%s", B + 1);

 

         N = strlen(A + 1);

         M = strlen(B + 1); 


1)pi 테이블 만들기

         pi[1] = 0;

         for (int i = 2; i <= M; i++) {

                  pi[i] = pi[i - 1] + 1;

                  while (true) {

                           if (B[pi[i]] == B[i]) { //같으면, pi[i] = pi[i - 1] + 1 가 그대로 유지

                                   break;

                           }

                           if (pi[i] == pi[pi[i - 1]] + 1) {  //pi[pi[i-1]] + 1 로 표현하는게 핵심

                                   pi[i] = 0;

                                   break;

                           }

                           pi[i] = pi[pi[i - 1]] + 1;

                  }

         } 


2)테이블 이용해서 문자열 매칭 찾아내기

   int k = 1;

         for (int i = 1; i <= N; i++) {

                  while (k > 0 && A[i] != B[k]) {

                           if (k == 1) {

                                   k = 0;

                                   break;

                           }

                           k = pi[k - 1] + 1; //같지 않은 부분을 만나면, k를 pi[k-1]+1 으로 이동.

                  }

                  if (k == M) { //찾음

                           Rcnt++;

                           R[Rcnt] = i - M + 1; //현재 찾아낸 위치 i는, 원래 문자열에서 M문자열만큼 움직인 상태이기에, i-M+1 해줌

                           k = pi[k];

                  }

                  k++;

         }


-끝-

반응형

'알고리즘 > 알고리즘 노트' 카테고리의 다른 글

[다이나믹]-문제2  (0) 2016.07.30
[다이나믹]-문제1  (0) 2016.07.30
[자료구조]  (0) 2016.07.27
[다이나믹]타일채우기 문제들  (0) 2016.07.26
[다이나믹]  (0) 2016.07.26