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

शब्द जोड़ें और खोजें - सी++ में डेटा संरचना डिजाइन


मान लीजिए कि हमें एक डेटा संरचना तैयार करनी है जो निम्नलिखित दो कार्यों का समर्थन करती है -

  • ऐडवर्ड (शब्द)

  • खोज (शब्द)

खोज (शब्द) विधि एक शाब्दिक शब्द या एक नियमित अभिव्यक्ति स्ट्रिंग खोज सकती है जिसमें केवल अक्षर a-z या .. A हो। इसका मतलब है कि यह किसी एक अक्षर का प्रतिनिधित्व कर सकता है। तो उदाहरण के लिए, यदि हम "बुरा", "पिताजी", "पागल" जैसे कुछ शब्द जोड़ते हैं, तो खोज ("पैड") → झूठा, खोज ("खराब") → सत्य, खोज (".ad") खोजें। → सत्य और खोज ("बी ..") → सत्य

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • कुछ विधियाँ हैं, शुरू में इन्सर्टनोड () को परिभाषित करें, यह हेड रेफरेंस और स्ट्रिंग s लेगा, यह निम्नानुसार काम करेगा -

  • वक्र:=सिर, n:=s का आकार

  • मेरे लिए 0 से n - 1 की सीमा में

    • एक्स:=एस [i]

    • अगर बच्चे [x] का curr शून्य नहीं है, तो बच्चे [x] का curr :=new node

    • curr :=बच्चे [x] करी के

  • isEnd of curr को सच के रूप में सेट करें

  • AddWord() से, इस insertNode() विधि को कॉल करें

  • चेक () नामक एक अन्य विधि को परिभाषित करें, यह curr, string s और index लेगा। प्रारंभ में सूचकांक 0 है। यह निम्नानुसार काम करेगा -

  • यदि अनुक्रमणिका =s का आकार, तो वापसी isEnd of curr

  • ठीक सेट करें:=सच

  • अगर s[index] डॉट है, तो

    • मेरे लिए 0 से 25 की सीमा में

      • x :='a' + i

        . का ASCII
      • अगर बच्चे [x] का कर्व और चेक (बच्चा [x] का curr, s, index + 1) सही है, तो सही लौटें।

  • अन्यथा

    • एक्स:=एस [सूचकांक]

    • अगर बच्चे [x] का कर्व और चेक (बच्चा [x] का curr, s, index + 1) सही है, तो सही लौटें।

  • झूठी वापसी

  • खोज विधि से, curr :=head और return check(curr, word, 0)

    . सेट करें

उदाहरण (C++)

आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;
struct Node{
   bool isEnd;
   map <char, Node*> child;
   Node(){
      isEnd = false;
   }
};
class WordDictionary {
   public:
   Node* head;
   WordDictionary() {
      head = new Node();
   }
   void insertNode(Node* head, string s){
      Node* curr = head;
      int n = s.size();
      for(int i = 0; i < n; i++){
         char x = s[i];
         if(!curr->child[x]){
            curr->child[x] = new Node();
         }
         curr = curr->child[x];
      }
      curr->isEnd = true;
   }
   void addWord(string word) {
      insertNode(head, word);
   }
   bool check(Node* curr, string s, int idx = 0){
      if(idx == s.size()) return curr->isEnd;
         bool ok = false;
      if(s[idx] == '.'){
         for(int i = 0; i < 26; i++){
            char x = 'a' + i;
            if(curr->child[x] && check(curr->child[x], s, idx + 1))return true;
         }
      } else {
         char x = s[idx];
         if(curr->child[x] && check(curr->child[x], s, idx + 1))return true;
      }
      return false;
   }
   bool search(string word) {
      Node* curr = head;
      return check(curr, word);
   }
};
main(){
   WordDictionary ob;
   ob.addWord("bad");
   ob.addWord("dad");
   ob.addWord("mad");
   cout << (ob.search("pad")) << endl;
   cout << (ob.search("bad")) << endl;
   cout << (ob.search(".ad")) << endl;
   cout << (ob.search("b..")) << endl;
}

इनपुट

Initialize the WordDictionary, then call the addWord() methods ans search methods. 
See in the main() function

आउटपुट

0
1
1
1

  1. डेटा संरचना में संपीड़ित क्वाडट्री और ऑक्ट्री

    संपीड़ित क्वाडट्री उप-विभाजित सेल से संबंधित प्रत्येक नोड को संग्रहीत करते समय, हम बहुत सारे खाली नोड्स को संग्रहीत कर सकते हैं। ऐसे विरल वृक्षों के आकार को कम करना केवल उन उप-वृक्षों को संग्रहीत करके संभव है जिनकी पत्तियों में दिलचस्प डेटा होता है (यानी महत्वपूर्ण उपट्री)। फिर से हम वास्तव में आका

  1. डेटा संरचना में अनुकूली विलय और छँटाई

    एडेप्टिव मर्ज सॉर्ट एडेप्टिव मर्ज सॉर्ट सॉर्ट किए गए सब-लिस्ट मर्ज सॉर्ट का मर्जिंग करता है। हालांकि, प्रारंभिक उप-सूची का आकार आकार 1 की उप-सूची होने के बजाय तत्वों की सूची के बीच क्रम के अस्तित्व पर निर्भर करता है। उदाहरण के लिए, चित्र में सूची पर विचार करें। इसमें 2 क्रमबद्ध उप-सूचियाँ होत

  1. अपने SQL डेटा में Elasticsearch-संचालित खोज और विज़ुअलाइज़ेशन जोड़ें

    नए NoSQL डेटा स्टोर पर ध्यान केंद्रित करने के बावजूद, रिलेशनल और SQL-आधारित डेटाबेस अभी भी जीवित हैं और अच्छी तरह से हैं। वास्तव में, हमारे साथ काम करने वाले लगभग हर ग्राहक के पास अपने वातावरण में उनके MongoDB, Redis, या Elasticsearch के साथ कुछ MySQL, PostgreSQL या MS SQL सर्वर होते हैं। किसी रिलेश