알고리즘/탐색

KMP 알고리즘 수정

Aif 2023. 10. 24. 11:05

https://yiyj1030.tistory.com/495

 

[알고리즘/ 파이썬] KMP 알고리즘 알아보기

KMP 알고리즘(Knuth-Morris-Pratt algorithm)이란 문자열 검색을 매우 빠르게 해주는 알고리즘이다. 특정 패턴이 주어졌을 때 전체 문자열을 빠르게 검색하여 그 패턴이 어디에 등장하는 지 찾아준다. KMP

yiyj1030.tistory.com

 

KMP 알고리즘을 구현하였는데 수정해야할 사항이 있었다.

 

사실 내가 구현한 코드는 KMP 알고리즘이라고 할 수 없다.

 

왜 그런지는 정확하게 설명할 수 없지만 KMP 알고리즘을 사용하지 않았다.

 

KMP 알고리즘의 패턴 테이블을 참조하여 중복 건너뛰기만 한 느낌이다.

 

일단 KMP 알고리즘이 정확하게 이해되지 않는 부분이

 

접두부의 인덱스를 패턴 테이블을 참조하여 이동하는 부분이었다.

 

위 글을 보며 계속해서 이해가 되고있는 중인데 아직 완벽하게 이해 되진 않는다.

 

vector<int> KMP(string p, string T) {
    vector<int> find;

    vector<int> pi = makepi(p);
    /*
    for (int i = 0; i < T.size() - p.size(); i++) {
        for (int j = 0; j < p.size(); j++) {
            if (p[j] != T[i + j]) {
                i = pi[j] + i;
                break;
            }
            if (j + 1 == p.size()) {
                find.push_back(i);
            }
        }
    }
    */

    int i = 0;
    int j = 0;

    while (i < T.size()) {
        if (p[j] == T[i]) {
            i++;
            j++;
        }
        if (j == p.size()) {
            find.push_back(i - j);
            j = pi[j - 1];
        }
        else if (i < T.size() && p[j] != T[i]) {
            if (j != 0) {
                j = pi[j - 1];
            }
            else {
                i++;
            }
        }
    }

    return find;
}

KMP 실행 부분을 수정하였다.

'알고리즘 > 탐색' 카테고리의 다른 글

문자열 탐색 - KMP  (0) 2023.10.23
문자열 탐색 - 카프 라빈  (0) 2023.10.23
문자열 탐색 - 무식한 탐색  (0) 2023.10.23
그래프의 순회 - BFS, DFS  (0) 2023.09.11
레드 블랙 트리의 삭제  (0) 2023.09.06