Knuth Morris Pratt (KMP) হল একটি অ্যালগরিদম, যা বাম থেকে ডানে অক্ষরগুলি পরীক্ষা করে৷ যখন একটি প্যাটার্নের সাব-প্যাটার্নে একটি সাব-প্যাটার্ন একাধিক প্রদর্শিত হয়, তখন এটি সেই সম্পত্তিটি ব্যবহার করে সময়ের জটিলতা উন্নত করতে, সবচেয়ে খারাপ ক্ষেত্রেও।
KMP-এর সময় জটিলতা হল O(n)।
ইনপুট এবং আউটপুট
Input: Main String: “AAAABAAAAABBBAAAAB”, The pattern “AAAB” Output: Pattern found at location: 1 Pattern found at location: 7 Pattern found at location: 14
অ্যালগরিদম
findPrefix(প্যাটার্ন, m, prefArray)
ইনপুট - প্যাটার্ন, প্যাটার্নের দৈর্ঘ্য এবং উপসর্গ অবস্থান সঞ্চয় করার জন্য একটি অ্যারে
আউটপুট - সঞ্চয় করার জন্য অ্যারে যেখানে উপসর্গগুলি অবস্থিত
Begin length := 0 prefArray[0] := 0 for all character index ‘i’ of pattern, do if pattern[i] = pattern[length], then increase length by 1 prefArray[i] := length else if length ≠ 0 then length := prefArray[length - 1] decrease i by 1 else prefArray[i] := 0 done End
kmp অ্যালগরিদম(টেক্সট, প্যাটার্ন)
ইনপুট: মূল পাঠ্য, এবং প্যাটার্ন, যা অনুসন্ধান করা হবে
আউটপুট - অবস্থান যেখানে নিদর্শন পাওয়া যায়
Begin n := size of text m := size of pattern call findPrefix(pattern, m, prefArray) while i < n, do if text[i] = pattern[j], then increase i and j by 1 if j = m, then print the location (i-j) as there is the pattern j := prefArray[j-1] else if i < n AND pattern[j] ≠ text[i] then if j ≠ 0 then j := prefArray[j - 1] else increase i by 1 done End
উদাহরণ
#include<iostream>
using namespace std;
void findPrefix(string pattern, int m, int prefArray[]) {
int length = 0;
prefArray[0] = 0; //first place is always 0 as no prefix
for(int i = 1; i<m; i++) {
if(pattern[i] == pattern[length]) {
length++;
prefArray[i] = length;
}else {
if(length != 0) {
length = prefArray[length - 1];
i--; //decrease i to avoid effect of increasing after iteration
}else
prefArray[i] = 0;
}
}
}
void kmpPattSearch(string mainString, string pattern, int *locArray, int &loc) {
int n, m, i = 0, j = 0;
n = mainString.size();
m = pattern.size();
int prefixArray[m]; //prefix array as same size of pattern
findPrefix(pattern, m, prefixArray);
loc = 0;
while(i < n) {
if(mainString[i] == pattern[j]) {
i++; j++;
}
if(j == m) {
locArray[loc] = i-j; //item found at i-j position.
loc++;
j = prefixArray[j-1]; //get the prefix length from array
}else if(i < n && pattern[j] != mainString[i]) {
if(j != 0)
j = prefixArray[j-1];
else
i++;
}
}
}
int main() {
string str = "AAAABAAAAABBBAAAAB";
string patt = "AAAB";
int locationArray[str.size()];
int index;
kmpPattSearch(str, patt, locationArray, index);
for(int i = 0; i<index; i++) {
cout << "Pattern found at location: " <<locationArray[i] << endl;
}
} আউটপুট
Pattern found at location: 1 Pattern found at location: 7 Pattern found at location: 14