Welcome to this comprehensive guide on the KMP (Knuth-Morris-Pratt) Algorithm in C programming! This tutorial is designed for beginners and intermediates who are eager to learn about string search algorithms. Let's dive in!
The KMP algorithm is a linear time and space string search algorithm used for finding patterns in strings. It is particularly useful when the pattern is repetitive and the text is large.
The KMP algorithm improves upon the naive string matching algorithm by pre-computing the 'fail' function, which helps in skipping unnecessary comparisons when a match fails. This makes it more efficient, especially for long patterns and large texts.
The KMP algorithm works by creating an array 'next' for the pattern. The 'next' array stores the length of the longest proper prefix of the pattern that is also a suffix. This array is pre-computed offline.
During the search phase, the text is scanned from left to right, and the pattern is compared with the text one character at a time. If a match fails, the algorithm jumps to a position determined by the 'next' array to minimize the number of comparisons.
Here's a simple implementation of the KMP algorithm in C:
#include <stdio.h>
#include <string.h>
void computeLPSArray(char *pat, int m, int *lps) {
int len = 0;
int i;
lps[0] = 0;
i = 1;
while (i < m) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else if (len > 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
int kmpSearch(char *pat, char *txt, int m, int n) {
int i, j;
int lps[m];
computeLPSArray(pat, m, lps);
i = 0;
j = 0;
while (i < n) {
if (txt[i] == pat[j]) {
i++;
j++;
}
if (j == m) {
return i - m;
}
if (i < n && txt[i] != pat[j]) {
if (j > 0) {
j = lps[j - 1];
} else {
i++;
}
}
}
return -1;
}
int main() {
char txt[] = "ABABDABACDABABCABAB";
char pat[] = "ABABCABAB";
int n = strlen(txt);
int m = strlen(pat);
int result = kmpSearch(pat, txt, m, n);
if (result != -1)
printf("Pattern found at position %d\n", result + 1);
else
printf("Pattern not found\n");
return 0;
}In this example, we search for the pattern "ABABCABAB" in the text "ABABDABACDABABCABAB". The KMP algorithm finds the pattern at position 6.
The KMP algorithm is useful in various real-world applications, such as text editors, web search engines, and DNA sequence analysis.
What does the 'next' array store in the KMP algorithm?
That's all for today! With this guide, you should now have a good understanding of the KMP algorithm in C programming. Stay tuned for more tutorials on C programming and other exciting topics! 💡🎯