>  기사  >  Java  >  Java를 사용하여 KMP 알고리즘을 구현하는 방법

Java를 사용하여 KMP 알고리즘을 구현하는 방법

WBOY
WBOY원래의
2023-09-20 10:52:44627검색

Java를 사용하여 KMP 알고리즘을 구현하는 방법

Java를 사용하여 KMP 알고리즘을 구현하는 방법

KMP 알고리즘(Karp-Miller-Rosenberg 알고리즘)은 이미 일치된 정보를 사용하여 불필요한 일치를 방지하여 일치 효율성을 높이는 문자열 일치 알고리즘입니다. KMP 알고리즘은 대규모 텍스트 및 패턴 문자열 일치를 처리할 때 효율적인 알고리즘입니다. 이 기사에서는 Java를 사용하여 KMP 알고리즘을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

1. KMP 알고리즘의 원리
1.1. 접두사 함수
KMP 알고리즘의 핵심 아이디어는 접두사 함수(가장 긴 공통 접두사 및 접미사라고도 함)를 사용하여 패턴 문자열의 점프를 처리하는 것입니다. 매칭이 실패합니다.

접두사 함수는 배열 pi이며, 여기서 pi[i]는 패턴 문자열의 첫 번째 i 문자 중 i번째 문자로 끝나는 문자열의 가장 긴 참 접두어와 가장 긴 참 접미사의 길이를 나타냅니다. 예를 들어, 패턴 문자열 "ababaca"의 접두사 함수는 [0, 0, 1, 2, 3, 0, 1]입니다.

1.2. KMP 알고리즘의 주요 단계
KMP 알고리즘의 주요 단계는 다음과 같습니다.
1) 패턴 문자열의 접두어 함수를 계산합니다.
2) 텍스트 문자열을 일치시키고 접두어 함수를 사용하여 상황을 처리합니다. 매칭 실패.

2. KMP 알고리즘 구현
아래에서는 Java를 사용하여 KMP 알고리즘을 구현하는 방법을 소개합니다.

public class KMP {
    public static int[] computePrefixFunction(String pattern) {
        int m = pattern.length();
        int[] pi = new int[m];
        int k = 0;
        for (int i = 1; i < m; i++) {
            while (k > 0 && pattern.charAt(k) != pattern.charAt(i)) {
                k = pi[k - 1];
            }
            if (pattern.charAt(k) == pattern.charAt(i)) {
                k++;
            }
            pi[i] = k;
        }
        return pi;
    }

    public static int search(String text, String pattern) {
        int n = text.length();
        int m = pattern.length();
        int[] pi = computePrefixFunction(pattern);
        int q = 0;
        for (int i = 0; i < n; i++) {
            while (q > 0 && pattern.charAt(q) != text.charAt(i)) {
                q = pi[q - 1];
            }
            if (pattern.charAt(q) == text.charAt(i)) {
                q++;
            }
            if (q == m) {
                return i - m + 1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        String text = "ababababacaba";
        String pattern = "bac";
        int index = search(text, pattern);
        if (index != -1) {
            System.out.println("Pattern found at index " + index);
        } else {
            System.out.println("Pattern not found");
        }
    }
}

위 코드에서는 패턴 문자열의 접두사 함수를 계산하는 데 ComputePrefixFunction 함수를 사용하고, 텍스트 문자열에서 일치하는 데 검색 함수를 사용합니다. 메인 함수에서는 검색 함수를 호출하여 패턴 일치를 수행하고 일치 결과를 출력하는 방법을 볼 수 있습니다.

3. 요약
KMP 알고리즘을 사용하면 문자열 매칭 작업을 효과적으로 수행할 수 있습니다. 이 기사에서는 KMP 알고리즘의 원리와 Java를 사용하여 KMP 알고리즘을 구현하는 방법을 소개합니다. 이 글이 KMP 알고리즘을 배우고 이해하는 데 도움이 되기를 바랍니다.

위 내용은 Java를 사용하여 KMP 알고리즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.