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

सी++ में बीके ट्री परिचय

बीके ट्री या बर्कहार्ड ट्री एक डेटा संरचना का एक रूप है जो आमतौर पर लेवेनशेटिन दूरी के आधार पर वर्तनी जांच करने के लिए उपयोग किया जाता है। इसका उपयोग स्ट्रिंग मिलान के लिए भी किया जाता है स्वत:सुधार सुविधा का उपयोग इस डेटा संरचना को बनाने के लिए किया जा सकता है। मान लीजिए कि हमारे पास एक शब्दकोश में कुछ शब्द हैं और हमें वर्तनी की त्रुटियों के लिए कुछ अन्य शब्दों की जांच करने की आवश्यकता है। हमारे पास ऐसे शब्दों का संग्रह होना चाहिए जो दिए गए शब्द के करीब हों जिनकी वर्तनी की जाँच की जानी है। उदाहरण के लिए, यदि हमारे पास "uck" शब्द है, तो सही शब्द हो सकता है (ट्रक, बतख, बतख, चूसना)। इसलिए वर्तनी की गलतियों को किसी शब्द को हटाकर या एक उपयुक्त अक्षर के स्थान पर एक नया शब्द जोड़कर सुधारा जा सकता है। एक पैरामीटर के रूप में संपादन दूरी का उपयोग करना और शब्दकोश के साथ वर्तनी की जांच करना।

अन्य सभी पेड़ों की तरह, बीके ट्री में भी नोड्स और किनारे होते हैं नोड्स एक शब्दकोश में शब्दों का प्रतिनिधित्व करते हैं किनारे में कुछ पूर्णांक भार होते हैं जो हमें एक नोड से दूसरे नोड में संपादन दूरी के बारे में जानकारी देते हैं।

शब्दों के साथ एक शब्दकोश पर विचार करें {पुस्तक, किताबें, बू, केक, केप} -

सी++ में बीके ट्री परिचय

बीके ट्री

बीके ट्री में प्रत्येक नोट में समान संपादन दूरी के साथ ठीक एक चाइल्ड नोड है। यदि हम नोड्स डालने के दौरान संपादन दूरी में कुछ टकराव का सामना करते हैं, तो हम सही बच्चा प्राप्त होने तक सम्मिलन प्रक्रिया का प्रचार करेंगे। प्रत्येक सम्मिलन रूट नोड से शुरू होता है रूट नोड कोई भी शब्द हो सकता है। अब तक हमने सीखा कि बीके ट्री क्या है। अब देखते हैं कि सही निकटतम शब्द कैसे खोजा जाए। सबसे पहले, हमें सहिष्णुता मूल्य निर्धारित करने की आवश्यकता है यह सहिष्णुता मूल्य मेरे गलत वर्तनी वाले शब्द और सही शब्द के बीच अधिकतम संपादन दूरी के अलावा और कुछ नहीं है।

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

[dist - TOL, dist+TOL], इससे जटिलता काफी हद तक कम हो जाती है।

उदाहरण

कार्य को स्पष्ट करने के लिए कार्यक्रम -

#include "bits/stdc++.h"
using namespace std;
#define MAXN 100
#define TOL 2
#define LEN 10
struct Node {
   string word;
   int next[2*LEN];
   Node(string x):word(x){
      for(int i=0; i<2*LEN; i++)
      next[i] = 0;
   }
   Node() {}
};
Node RT;
Node tree[MAXN];
int ptr;
int min(int a, int b, int c) {
   return min(a, min(b, c));
}
int editDistance(string& a,string& b) {
   int m = a.length(), n = b.length();
   int dp[m+1][n+1];
   for (int i=0; i<=m; i++)
      dp[i][0] = i;
   for (int j=0; j<=n; j++)
      dp[0][j] = j;
   for (int i=1; i<=m; i++) {
      for (int j=1; j<=n; j++) {
         if (a[i-1] != b[j-1])
            dp[i][j] = min( 1 + dp[i-1][j], 1 + dp[i][j-1], 1 + dp[i-1][j-1] );
         else
            dp[i][j] = dp[i-1][j-1];
      }
   }
   return dp[m][n];
}
void insertValue(Node& root,Node& curr) {
   if (root.word == "" ){
      root = curr;
      return;
   }
   int dist = editDistance(curr.word,root.word);
   if (tree[root.next[dist]].word == ""){
      ptr++;
      tree[ptr] = curr;
      root.next[dist] = ptr;
   }
   else{
      insertValue(tree[root.next[dist]],curr);
   }
}
vector <string> findCorrectSuggestions(Node& root,string& s){
   vector <string> corrections;
   if (root.word == "")
      return corrections;
   int dist = editDistance(root.word,s);
   if (dist <= TOL) corrections.push_back(root.word);
      int start = dist - TOL;
   if (start < 0)
      start = 1;
   while (start < dist + TOL){
      vector <string> temp = findCorrectSuggestions(tree[root.next[start]],s);
      for (auto i : temp)
      corrections.push_back(i);
      start++;
   }
   return corrections;
}
int main(){
   string dictionary[] = {"book","cake","cart","books", "boo" };
   ptr = 0;
   int size = sizeof(dictionary)/sizeof(string);
   for(int i=0; i<size; i++){
      Node tmp = Node(dictionary[i]);
      insertValue(RT,tmp);
   }
   string word1 = "ok";
   string word2 = "ke";
   vector <string> match = findCorrectSuggestions(RT,word1);
   cout<<"Correct words suggestions from dictionary for : "<<word1<<endl;
   for (auto correctWords : match)
   cout<<correctWords<<endl;
   match = findCorrectSuggestions(RT,word2);
   cout<<"Correct words suggestions from dictionary for : "<<word2<<endl;
   for (auto correctWords : match)
   cout<<correctWords<<endl;
   return 0;
}

आउटपुट

Correct words suggestions from dictionary for : ok
book
boo
Correct words suggestions from dictionary for : ke
cake

  1. सी++ में एक पेड़ में सभी सेबों को इकट्ठा करने का न्यूनतम समय

    मान लीजिए कि हमारे पास एक अप्रत्यक्ष पेड़ है जिसमें n शीर्ष हैं और इनकी संख्या 0 से n-1 तक है, जिसके शीर्षों में कुछ सेब हैं। हम पेड़ के एक किनारे पर चलने में 1 सेकंड खर्च करते हैं। पेड़ में सभी सेबों को शीर्ष 0 से शुरू करने और इस शीर्ष पर वापस आने के लिए हमें सेकंड में न्यूनतम समय निकालना होगा। यह

  1. C++ में ट्री नोड्स हटाएं

    मान लीजिए कि हमारे पास एक पेड़ है, इस पेड़ की जड़ें नोड 0 पर हैं, यह इस प्रकार दिया गया है - नोड्स की संख्या नोड्स है ith नोड का मान मान है[i] ith नोड का जनक माता-पिता है[i] हमें प्रत्येक सबट्री को हटाना होगा जिसका नोड्स के मानों का योग 0 है, ऐसा करने के बाद पेड़ में शेष नोड्स की संख्या वापस कर द

  1. C++ में पेड़ का व्यास

    मान लीजिए कि हमारे पास एक अप्रत्यक्ष पेड़ है; हमें इसका व्यास ज्ञात करना है - उस पेड़ के सबसे लंबे पथ में किनारों की संख्या उस पेड़ का व्यास है। यहां पेड़ को किनारे की सूची के रूप में दिया गया है जहां किनारों [i] =[यू, वी] नोड्स यू और वी के बीच एक द्विदिश किनारा है। प्रत्येक नोड में सेट {0, 1, ...,