Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> प्रोग्रामिंग

बैड कैरेक्टर यूरिस्टिक

बैड कैरेक्टर यूरिस्टिक मेथड बॉयर-मूर एल्गोरिदम के दृष्टिकोणों में से एक है। दूसरा दृष्टिकोण गुड सफिक्स यूरिस्टिक है। इस मेथड में हम एक बैड कैरेक्टर ढूंढने का प्रयास करेंगे, जिसका अर्थ है मेन स्ट्रिंग का एक कैरेक्टर, जो पैटर्न से मेल नहीं खा रहा है। जब मिसमैच हुआ है, तो हम पूरे पैटर्न को तब तक शिफ्ट करेंगे जब तक मिसमैच मैच न बन जाए, अन्यथा पैटर्न बैड कैरेक्टर के पार चला जाता है।

यहां बेस्ट केस के लिए टाइम कॉम्प्लेक्सिटी O(m/n) है और सबसे खराब केस के लिए O(mn), जहां n टेक्स्ट की लंबाई है और m पैटर्न की लंबाई है।

इनपुट और आउटपुट

इनपुट: मेन स्ट्रिंग: "ABAAABCDBBABCDDEBCABC", पैटर्न "ABC"
आउटपुट: पैटर्न मिला स्थिति: 4
पैटर्न मिला स्थिति: 10
पैटर्न मिला स्थिति: 18

एल्गोरिदम

badCharacterHeuristic(pattern, badCharacterArray)

इनपुट: पैटर्न, जिसे खोजा जाएगा, भविष्य के उपयोग के लिए लोकेशन स्टोर करने के लिए बैड कैरेक्टर ऐरे

आउटपुट: भविष्य के उपयोग के लिए बैड कैरेक्टर ऐरे भरें

Begin
    n := pattern length
    for all entries of badCharacterArray, do
        set all entries to -1
    done
    for all characters of the pattern, do
        set last position of each character in badCharacterArray.
    done
End

searchPattern(pattern, text)

इनपुट: पैटर्न, जिसे खोजा जाएगा और मेन टेक्स्ट

आउटपुट: वे लोकेशन जहां पैटर्न मिला

Begin
    patLen := length of pattern
    strLen := length of text.
    call badCharacterHeuristic(pattern, badCharacterArray)
    shift := 0
    while shift <= (strLen - patLen), do
        j := patLen - 1
        while j >= 0 and pattern[j] = text[shift + j], do
            decrease j by 1
        done
        if j < 0, then
            print the shift as, there is a match
            if shift + patLen < strLen, then
                shift := shift + patLen - badCharacterArray[text[shift + patLen]]
            else
                increment shift by 1
        else
            shift := shift + max(1, j - badCharacterArray[text[shift + j]])
        done
    done
End

उदाहरण

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

int maximum(int data1, int data2) {
    if(data1 > data2)
        return data1;
    return data2;
}

void badCharacterHeuristic(string pattern, int badCharacter[MAXCHAR]) {
    int n = pattern.size(); // पैटर्न की लंबाई ढूंढें
    for(int i = 0; i < MAXCHAR; i++)
        badCharacter[i] = -1; // सभी कैरेक्टर डिस्टेंस को -1 पर सेट करें
    for(int i = 0; i < n; i++) {
        badCharacter[(int)pattern[i]] = i; // ऐरे में कैरेक्टर की स्थिति सेट करें।
    }
}

void searchPattern(string mainString, string pattern, int *array, int *index) {
    int patLen = pattern.size();
    int strLen = mainString.size();
    int badCharacter[MAXCHAR]; // बैड कैरेक्टर पोजीशन के लिए ऐरे बनाएं
    badCharacterHeuristic(pattern, badCharacter); // बैड कैरेक्टर ऐरे भरें
    int shift = 0;
    while(shift <= (strLen - patLen)) {
        int j = patLen - 1;
        while(j >= 0 && pattern[j] == mainString[shift + j]) {
            j--; // जब पैटर्न और मेन स्ट्रिंग कैरेक्टर मैच कर रहे हों तो j घटाएं
        }
        if(j < 0) {
            (*index)++;
            array[(*index)] = shift;
            if((shift + patLen) < strLen) {
                shift += patLen - badCharacter[mainString[shift + patLen]];
            } else {
                shift += 1;
            }
        } else {
            shift += maximum(1, j - badCharacter[mainString[shift + j]]);
        }
    }
}

int main() {
    string mainString = "ABAAABCDBBABCDDEBCABC";
    string pattern = "ABC";
    int locArray[mainString.size()];
    int 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. HTML कैरेक्टर सेट (Charset) HTML कैरेक्टर सेट (Charset)

    HTML कैरेक्टर सेट (Character Encoding) क्या है? कैरेक्टर सेट (charsets) वर्णों को बाइट्स में एन्कोड करने के मानक हैं। प्रमुख कैरेक्टर सेट में शामिल हैं: ASCII - 128 अल्फ़ान्यूमेरिक वर्ण परिभाषित करता है (अंग्रेजी के लिए)। ANSI (Windows-1252) - 256 वर्ण, पश्चिमी यूरोपीय भाषाओं के लिए। ISO-8859-1 -

  1. HTML pattern एट्रिब्यूट: इनपुट वैलिडेशन के लिए रेगुलर एक्सप्रेशन HTML pattern एट्रिब्यूट: इनपुट वैलिडेशन के लिए रेगुलर एक्सप्रेशन

    HTML pattern एट्रिब्यूट एक रेगुलर एक्सप्रेशन (RegExp) निर्दिष्ट करता है जिसका मिलान <input> एलिमेंट के मान से किया जाता है फॉर्म सबमिशन के दौरान। यह कस्टम वैलिडेशन नियमों के लिए शक्तिशाली टूल है जैसे पासवर्ड जटिलता, फोन नंबर प्रारूप, कस्टम आईडी प्रारूप, आदि। सिंटैक्स (Syntax) <input patte

  1. C में हार्ट पैटर्न प्रिंट करना C में हार्ट पैटर्न प्रिंट करना

    इस प्रोग्राम में हम देखेंगे कि C में हार्ट शेप पैटर्न कैसे प्रिंट करें। हार्ट शेप पैटर्न ऐसा दिखेगा: अब यदि हम इस पैटर्न का विश्लेषण करें, तो हम इस पैटर्न में अलग-अलग सेक्शन पा सकते हैं। हार्ट का बेस एक उल्टा ट्रायंगल है; ऊपरी भाग में दो अलग-अलग पीक्स हैं। इन दो पीक्स के बीच एक गैप है। इस पैटर्न