[java] 자바에서 사용하는 KMP 알고리즘

KMP(Knuth-Morris-Pratt) 알고리즘은 문자열 검색 알고리즘 중 하나로, 특정 패턴을 찾는 데 사용됩니다. 이 알고리즘은 특정 텍스트에서 특정 패턴을 효율적으로 찾아내는 데 사용됩니다. KMP 알고리즘을 사용하면 문자열 검색 속도를 향상시킬 수 있습니다.

KMP 알고리즘의 동작

KMP 알고리즘은 주어진 텍스트에서 패턴과 일치하는 부분을 찾기 위해 텍스트를 한 글자씩 이동하면서 비교해나갑니다. 이때, 패턴에서 일치하지 않는 부분이 발견되면, 그 일치하지 않는 위치부터 다시 비교를 시작하지 않고, 패턴의 앞 부분에서 일치하지 않은 부분과 일치하는 부분을 찾아 건너뛰는 방식으로 동작합니다.

KMP 알고리즘의 예시

public class KMPAlgorithm {
    public static int kmpSearch(String text, String pattern) {
        int[] lps = computeLPSArray(pattern);
        int textLength = text.length();
        int patternLength = pattern.length();
        int i = 0;  // 인덱스 i는 text를 순회하는 인덱스
        int j = 0;  // 인덱스 j는 pattern을 순회하는 인덱스
        while (i < textLength) {
            if (pattern.charAt(j) == text.charAt(i)) {
                i++;
                j++;
            }
            if (j == patternLength) {
                System.out.println("패턴이 텍스트에서 인덱스 " + (i - j) + " 에서 발견되었습니다.");
                j = lps[j - 1];
            } else if (i < textLength && pattern.charAt(j) != text.charAt(i)) {
                if (j != 0) {
                    j = lps[j - 1];
                } else {
                    i++;
                }
            }
        }
        return -1;  // 패턴이 없을 경우 -1 반환
    }

    private static int[] computeLPSArray(String pattern) {
        int patternLength = pattern.length();
        int[] lps = new int[patternLength];
        int len = 0;
        int i = 1;
        lps[0] = 0;
        while (i < patternLength) {
            if (pattern.charAt(i) == pattern.charAt(len)) {
                len++;
                lps[i] = len;
                i++;
            } else {
                if (len != 0) {
                    len = lps[len - 1];
                } else {
                    lps[i] = len;
                    i++;
                }
            }
        }
        return lps;
    }
}

위의 코드는 자바에서 KMP 알고리즘을 구현한 예시입니다. KMP 알고리즘은 효율적인 패턴 검색을 위해 LPS(Longest Proper Prefix which is also Suffix) 배열을 사용하여 패턴 일치의 위치를 찾아냅니다.

KMP 알고리즘은 문자열 검색 알고리즘 중 성능이 우수한 알고리즘 중 하나입니다. 이 알고리즘을 사용하면 대용량의 텍스트에서 원하는 패턴을 효율적으로 찾을 수 있습니다.

참고 자료