কম্পিউটার টিউটোরিয়াল

C++-এ ফাইনাইট স্টেট অটোমেটা (Finite State Automaton) বেসড সার্চ


এটি একটি C++ প্রোগ্রাম যা ফাইনাইট স্টেট অটোমেটা (Finite State Automaton) বেসড সার্চ করে। সীমিত সংখ্যক স্টেট (state) বিশিষ্ট অটোমেটাকে ফাইনাইট অটোমেটা বলা হয়। এখানে একটি টেক্সট `text[0...t-1]` এবং একটি প্যাটার্ন `p[0...p-1]` দেওয়া আছে। প্যাটার্নটি টেক্সটে খুঁজে বের করে এর সব অকারের ইনডেক্স প্রিন্ট করতে হবে।

এলগরিদম

Begin
    Function void transitiontable():
    1) প্রথম রোয়ের এন্ট্রিগুলো দিন এবং ফিল আপ করুন। প্রথম রোয়ের সব এন্ট্রি ০ ছাড়া p[0] ক্যারেক্টারের জন্য। p[0]-এর জন্য সবসময় স্টেট ১-এ যেতে হবে।
    2) longestprefixsuffix (lps) ০ দিয়ে ইনিশিয়ালাইজ করুন।
    3) for i = 1 to P (P হলো প্যাটার্নের দৈর্ঘ্য)
        a) longestprefixsuffix রোয়ের ইনডেক্স থেকে এন্ট্রিগুলো কপি করুন।
        b) p[i] ক্যারেক্টারের এন্ট্রি আপডেট করুন i+1 দিয়ে।
        c) longestprefixsuffix আপডেট করুন: lps = TT[lps][pat[i]]
           যেখানে TT হলো ২ডি অ্যারে।
End

উদাহরণ

#include <iostream>
#include <cstring>
#define NO_OF_CHARS 512
using namespace std;

// দिये गये প্যাটার্নের জন্য ফাইনাইট অটোমেটা রিপ্রেজেন্ট করার TF টেবিল বিল্ড করে
void transitiontable(char *p, int P, int TT[][NO_OF_CHARS]) {
    int i, longestprefixsuffix = 0, y;
    // প্রথম রোয়ে এন্ট্রি দিন
    for (y = 0; y < NO_OF_CHARS; y++)
        TT[0][y] = 0;
    TT[0][p[0]] = 1;
    // অন্যান্য রোয়ে এন্ট্রি দিন
    for (i = 1; i <= P; i++) {
        // longestprefixsuffix রোয়ের ইনডেক্স থেকে ভ্যালু কপি
        for (y = 0; y < NO_OF_CHARS; y++)
            TT[i][y] = TT[longestprefixsuffix][y];
        // এন্ট্রি আপডেট
        TT[i][p[i]] = i + 1;
        // পরবর্তী রোয়ের জন্য lps আপডেট
        if (i < P)
            longestprefixsuffix = TT[longestprefixsuffix][p[i]];
    }
}

// টেক্সটে প্যাটার্নের সব অকার প্রিন্ট
void patternsearch(char *p, char *t) {
    int P = strlen(p);
    int T = strlen(t);
    int TT[P+1][NO_OF_CHARS];
    transitiontable(p, P, TT);
    // FA ওভার টেক্সট প্রসেস
    int i, j = 0;
    for (i = 0; i < T; i++) {
        j = TT[j][t[i]];
        if (j == P) {
            cout << "\n pattern is found at index: " << i - P + 1;
        }
    }
}

int main() {
    char *text = "AABAA ABBAACCDD CCDDAABAA"; // ইনপুট টেক্সট
    char *pattern = "AABAA"; // ইনপুট প্যাটার্ন
    patternsearch(pattern, text);
    getchar();
    return 0;
}

আউটপুট

pattern is found at index: 0
pattern is found at index: 20
  1. বাইনারি সার্চ C++ প্রোগ্রামে

  2. C++ প্রোগ্রাম: বাইনারি সার্চ ট্রিতে লেফ্ট রোটেশন করা

  3. জটিল সংখ্যা গুণফল বের করার C++ প্রোগ্রাম

  4. ম্যাট্রিক্স মাল্টিপ্লিকেশন (Matrix Multiplication) করার C++ প্রোগ্রাম