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

ব্যাড ক্যারেক্টার হিউরিস্টিক (Bad Character Heuristic)

ব্যাড ক্যারেক্টার হিউরিস্টিক বয়ার মূর অ্যালগরিদমের একটি অন্য অ্যাপ্রোচ। এতে "ব্যাড ক্যারেক্টার" (যে ক্যারেক্টার মিসম্যাচ হয়) খুঁজে বের করা হয়। মিসম্যাচ হলে পুরো প্যাটার্ন শিফট করা হয় যাতে মিসম্যাচ ম্যাচে পরিণত হয়, নাহলে প্যাটার্ন ব্যাড ক্যারেক্টারকে পেরিয়ে চলে যায়।

কমপ্লেক্সিটি

  • বেস্ট কেস: O(m/n)
  • ওয়ার্স্ট কেস: O(mn) (m = প্যাটার্ন লেথ, n = টেক্সট লেথ)

ইনপুট এবং আউটপুট

Input: Main String: "ABAAABCDBBABCDDEBCABC", Pattern: "ABC"
Output: Pattern found at position: 4
        Pattern found at position: 10
        Pattern found at position: 18

অ্যালগরিদম

badCharacterHeuristic(pattern, badCharArray)

Begin
    n := pattern length
    badCharArray সব এন্ট্রি -1 করে ইনিশিয়ালাইজ
    for pattern-এর সব ক্যারেক্টার: badCharArray[char] = last position
End

searchPattern(pattern, text)

Begin
    patLen, strLen
    badCharacterHeuristic কল করুন
    shift := 0
    while shift <= strLen - patLen:
        j := patLen - 1
        while j >= 0 AND pattern[j] == text[shift+j]: j--
        if j < 0: print match at shift
            if shift+patLen < strLen: shift += patLen - badCharArray[text[shift+patLen]]
            else: shift++
        else: shift += max(1, j - badCharArray[text[shift+j]])
    done
End

C++ উদাহরণ

#include <iostream>
#define MAXCHAR 256
using namespace std;

int maximum(int a, int b) { return (a>b)?a:b; }

void badCharacterHeuristic(string pattern, int badChar[MAXCHAR]) {
    int n = pattern.size();
    for(int i=0; i= 0 && pattern[j] == mainString[shift+j]) j--;
        if(j < 0) {
            (*index)++; array[*index] = shift;
            if(shift + patLen < strLen) shift += patLen - badChar[mainString[shift+patLen]];
            else shift++;
        } else shift += maximum(1, j - badChar[mainString[shift+j]]);
    }
}

int main() {
    string mainString = "ABAAABCDBBABCDDEBCABC";
    string pattern = "ABC";
    int locArray[mainString.size()], index = -1;
    searchPattern(mainString, pattern, locArray, &index);
    for(int i=0; i<=index; i++) cout << "Pattern found at position: " << locArray[i] << endl;
}

আউটপুট

Pattern found at position: 4
Pattern found at position: 10
Pattern found at position: 18
  1. জাভাস্ক্রিপ্টে সংখ্যা প্যাটার্ন প্রিন্ট করা

  2. HTML Charset (ক্যারেক্টার সেট)

  3. HTML pattern অ্যাট্রিবিউট

  4. সি প্রোগ্রামিং-এ হার্ট প্যাটার্ন প্রিন্ট করা