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

कसाई का एल्गोरिदम


कसाई का एल्गोरिदम सफिक्स ऐरे से लॉन्गेस्ट कॉमन प्रीफिक्स (LCP) ऐरे प्राप्त करने के लिए उपयोग किया जाता है। सबसे पहले सफिक्स ऐरे ढूंढे जाते हैं। उसके बाद कसाई का एल्गोरिदम LCP ढूंढने के लिए सफिक्स ऐरे सूची लेता है।

LCP ऐरे के लिए, यह O(m log n) लेता है, जहां m पैटर्न की लंबाई है और n टेक्स्ट की लंबाई है। कसाई के एल्गोरिदम के लिए, यह मुख्य स्ट्रिंग में पैटर्न खोजने के लिए O(n) लेता है।

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

इनपुट: मुख्य स्ट्रिंग: "banana" आउटपुट: सफिक्स ऐरे: 5 3 1 0 4 2 कॉमन प्रीफिक्स ऐरे: 1 3 0 0 2 0

एल्गोरिदम

buildSuffixArray(text)

इनपुट: मुख्य स्ट्रिंग

आउटपुट: मुख्य टेक्स्ट से बना सफिक्स ऐरे

Begin 
  n := size of text 
  for i := 0 to n, do 
    suffArray[i].index := i 
    suffArray[i].rank[0] := text[i] 
    if (i+1) < n, then 
      suffArray[i].rank[1] := text[i+1] 
    else 
      suffArray[i].rank[1] := -1 
  do 
    sort the suffix array 
    define index array to store indexes 
    for k := 4 to (2*n)-1, increase k by k*2, do 
      currRank := 0 
      prevRank := suffArray[0].rank[0] 
      suffArray[0].rank[0] := currRank 
      index[suffArray[0].index] = 0 
      for all character index i of text, do 
        if suffArray[i].rank[0] = prevRank AND suffArray[i].rank[1] = suffArray[i-1].rank[1], then 
          prevRank := suffArray[i].rank[0] 
          suffArray[i].rank[0] := currRank 
        else 
          prevRank := suffArray[i].rank[0] 
          suffArray[i].rank[0] := currRank + 1 
          currRank := currRank + 1 
          index[suffArray[i].index] := i 
      done 
      for all character index i of text, do 
        nextIndex := suffArray[i].index + k/2 
        if nextIndex < n, then 
          suffArray[i].rank[1] := suffArray[index[nextIndex]].rank[0] 
        else 
          suffArray[i].rank[1] := -1 
      done 
      sort the suffArray 
    done 
    for all character index i of text, do 
      insert suffArray[i].index into suffVector 
    done 
End

kasaiAlgorithm(text, suffVector)

इनपुट - मुख्य टेक्स्ट, और सफिक्स वेक्टर सफिक्स की सूची के रूप में

आउटपुट: वह स्थान जहां लॉन्गेस्ट कॉमन प्रीफिक्स मिला

Begin 
  n := size of suffVector 
  define longPrefix list of size n and fill all entries with 0 
  define suffInverse list of size n and fill all entries with 0 
  for all index values 'i' of suffVector, do 
    suffInverse[suffVector[i]] = i 
  done 
  k := 0 
  for i := 0 to n-1, do 
    if suffInverse[i] = n-1 then 
      k :=0 
      ignore the bottom part and go for next iteration. 
    j := suffVector[suffInverse[i]+1] 
    while (i+k) 0 then 
      decrease k by 1 
  done 
  return longPrefix 
End

उदाहरण

#include<iostream> #include<vector> #include<algorithm> using namespace std; struct suffix { int index; int rank[2]; // To store rank pair }; bool compare(suffix s1, suffix s2) { //compare suffixes for sort function if(s1.rank[0] == s2.rank[0]) { if(s1.rank[1] < s2.rank[1]) return true; else return false; }else { if(s1.rank[0] < s2.rank[0]) return true; else return false; } } vector buildSuffixArray(string mainString) { int n = mainString.size(); suffix suffixArray[n]; for (int i = 0; i < n; i++) { suffixArray[i].index = i; suffixArray[i].rank[0] = mainString[i] - 'a'; //store old rank suffixArray[i].rank[1] = ((i+1)suffixVector; for (int i = 0; i < n; i++) suffixVector.push_back(suffixArray[i].index); //index of all suffix to suffix vector return suffixVector; } vector kasaiAlgorithm(string mainString, vector suffixVector) { int n = suffixVector.size(); vector longPrefix(n, 0); //size n and initialize with 0 vector suffixInverse(n, 0); for (int i=0; i < n; i++) suffixInverse[suffixVector[i]] = i; //fill values of inverse Suffix list int k = 0; for (int i=0; i0) k--; //remofe first character of string } return longPrefix; } void showArray(vector vec) { vector::iterator it; for (it = vec.begin(); it < vec.end() ; it++) cout << *it << " "; cout << endl; } int main() { string mainString = "banana"; vectorsuffixArray = buildSuffixArray(mainString); int n = suffixArray.size(); cout<< "Suffix Array : "<commonPrefix = kasaiAlgorithm(mainString, suffixArray); cout<< "\nCommon Prefix Array : "<

आउटपुट

Suffix Array : 5 3 1 0 4 2 Common Prefix Array : 1 3 0 0 2 0
  1. फोर्ड-फुल्करसन एल्गोरिदम फोर्ड-फुल्करसन एल्गोरिदम

    फोर्ड-फुल्करसन एल्गोरिदम का उपयोग दिए गए ग्राफ में प्रारंभ शीर्ष से सिंक शीर्ष तक अधिकतम प्रवाह का पता लगाने के लिए किया जाता है। इस ग्राफ में, प्रत्येक किनारे की क्षमता होती है। दो शीर्ष दिए गए हैं जिन्हें स्रोत और सिंक नाम दिया गया है। स्रोत शीर्ष में सभी जावक किनारे होते हैं, कोई आवक किनारा नहीं

  1. फ्लॉयड वार्शल एल्गोरिदम फ्लॉयड वार्शल एल्गोरिदम

    फ्लॉयड-वार्शल एल्गोरिदम का उपयोग दिए गए वेटेड ग्राफ से सभी जोड़े के सबसे छोटे पथ की समस्या को हल करने के लिए किया जाता है। इस एल्गोरिदम के परिणामस्वरूप, यह एक मैट्रिक्स जनरेट करेगा, जो ग्राफ में किसी भी नोड से अन्य सभी नोड्स तक की न्यूनतम दूरी को दर्शाएगा। सबसे पहले, आउटपुट मैट्रिक्स ग्राफ के दिए ग

  1. - एल्गोरिदम में स्टेप काउंट मेथड

    स्टेप काउंट मेथड एल्गोरिदम का विश्लेषण करने की विधियों में से एक है। इस विधि में, हम गिनते हैं कि एक निर्देश कितनी बार निष्पादित हो रहा है। उससे हम एल्गोरिदम की जटिलता खोजने का प्रयास करेंगे।मान लीजिए हमारे पास अनुक्रमिक खोज करने के लिए एक एल्गोरिदम है। मान लीजिए प्रत्येक निर्देश को निष्पादित होने म