यहाँ एक समस्या है जो मुझे कुछ समय से परेशान कर रही है। मान लीजिए कि एक स्ट्रिंग 1s और 0s का अनुक्रम है, और वाइल्डकार्ड स्ट्रिंग 1, 0, और s का अनुक्रम है। सभी स्ट्रिंग्स और वाइल्डकार्ड स्ट्रिंग्स की लंबाई समान होती है। ये मानक UNIX वाइल्डकार्ड हैं; 10 ?? 1 मैच 10011, 10111, आदि - ए? उस स्थिति में 1 या 0 से मेल खाता है। अगर तथा वाइल्डकार्ड स्ट्रिंग्स हैं, फिर हम लिखते हैं अगर हर तार से मेल खाता है द्वारा भी मिलान किया जाता है ।
समस्याओं : एक सेट दिया वाइल्डकार्ड स्ट्रिंग्स, और एक क्वेरी (भी एक वाइल्डकार्ड स्ट्रिंग), वहाँ मौजूद है एक ऐसा है कि ? और यदि नहीं, तो क्या हम जोड़ सकते हैं सेवा कुशलतापूर्वक?
यहाँ स्पष्ट है समाधान (कहां) तार का आकार है, RAM का शब्द आकार (आमतौर पर 32 या 64)) है: सूची के प्रत्येक तत्व के माध्यम से जाएं और स्थिति का परीक्षण करें (जो कि बिट-ट्विडलिंग का उपयोग करके 2 या 3 ऑपरेशन में किया जा सकता है)। इसके अलावा अगर परीक्षण करें किसी भी आइटम के लिए रखती है जब हम स्कैन कर रहे हैं। अगर हमारे परीक्षण में विफल रहता है, फिर जोड़ें सेट करने के लिए, और निकालें हमने चिह्नित किया है।
लेकिन यह काफी तेज नहीं है। यह वास्तव में अच्छा होगा अगर वहाँ एक था समाधान, या, एक आदर्श दुनिया में, मूलांक वृक्ष के समान जटिलता ()। प्रश्नों का लगभग सही होना भी ठीक है : अर्थात्, तो हाँ या ना पर वापस लौटें; लेकिन अगर शर्त नहीं है तो निश्चित रूप से रिटर्न नं।
यद्यपि यह सबसे खराब स्थिति जटिलता में मदद नहीं करता है, आप यह मान सकते हैं कि सभी तत्व वाइल्डकार्ड स्ट्रिंग द्वारा बंधे हैं; वह है, कुछ मौजूद है ऐसे सभी के लिए , ।
विचार मैंने कोशिश की है
- वाइल्डकार्ड के तार एक जुड़ाव-अर्धविराम का निर्माण करते हैं। हमारे पास एक एन-एरी ट्री हो सकता है जो वाइल्डकार्ड स्ट्रिंग्स रखता है; पत्ते वाइल्डकार्ड स्ट्रिंग्स होंगे, और शाखाएं सभी बच्चों के शामिल होने का प्रतिनिधित्व करेंगी। यदि क्वेरी और ज्वाइन अतुलनीय हैं, तो हमें उस शाखा के सभी बच्चों के साथ तुलना करने के लिए समय बर्बाद करने की आवश्यकता नहीं है। इसके अलावा, अगर हम एक अपडेट करते हैं, और अपडेट एक जॉइन से अधिक होता है, तो हम पूरी शाखा को हटा सकते हैं। दुर्भाग्य से, यह अभी भी है सबसे खराब स्थिति में, और हम हमेशा तत्वों को जोड़ने के लिए पेड़ से स्कैन करते समय बनाने के लिए "सबसे अच्छा" जोड़ नहीं पाते हैं।
- एक का मूलांक तीन बन सकता है । हम जानते हैं किकुछ वाइल्डकार्ड स्ट्रिंग द्वारा बाध्य किया गया है; मान लें कि यह है? 0? 0। फिर तीनों की सभी शाखाओं को केवल स्ट्रिंग्स के पहले और तीसरे छोर पर होना चाहिए। यदि वर्तमान बिट हम क्वेरी पर शाखाओं में बँट रहे हैं, तो क्या हमें जाँच करनी है? और 1 शाखाएं; अगर यह 0 है, तो हम जाँच करते हैं? और 0 शाखाएं; अगर यह है?, हम केवल जाँच? डाली। क्योंकि हमें संभावित रूप से कई शाखाएँ लेनी हैं, यह बहुत अच्छा नहीं लगता है (इसी कारण से ट्राइ को अपडेट करना कठिन है)। चूंकि मिलान एक बहुत ही त्वरित ऑपरेशन है, यह एक पेड़ में बहुत सारे ट्रैवर्सिंग करने के लिए भोले की रणनीति की तुलना में दर्द होता है (संकेत का एक गुच्छा कुछ ओआरएस और एंड्स करने की तुलना में बहुत अधिक महंगा है)।
संबंधित कार्य
नेटवर्किंग समुदाय में, यह समस्या "पैकेट वर्गीकरण" के रूप में प्रकट होती है, यहां एल्गोरिदम और डेटा संरचनाओं का एक अच्छा सर्वेक्षण है । दुर्भाग्य से, यह धारणा लगभग हमेशा बनी हुई है कि वाइल्डकार्ड स्ट्रिंग्स केवल उपसर्गों से मेल खाते हैं, और क्वेरी ऐसे स्ट्रिंग्स का एक टपल है। बेशक, हम हमेशा इन मानदंडों को पूरा करने के लिए एक सामान्य वाइल्डकार्ड स्ट्रिंग बदल सकते हैं: 1? 00? 1 ?? है (१,;, ०, ० ;, १,?,?)। हालांकि यह कुशल नहीं होगा। अन्य धारणा यह है कि ये ट्यूपल्स एक "रंग" से जुड़े हैं, और क्वेरी को रंग वापस करना चाहिए (न कि यह मेल खाता है)। यह समस्या को बहुत कठिन बना देता है, क्योंकि हमें टुपल्स का आदेश देना होता है (या यह अस्पष्ट है कि कौन से (0;?) और (,, 1) मैच (0, 1) हैं।
एल्गोरिदम समुदाय में मुझे "न परवाह" के साथ मेल खाने वाले सबस्ट्रिंग को खोजने से संबंधित बहुत सारे परिणाम मिले हैं। यह काफी कठिन समस्या है, और मैं वास्तव में किसी भी तकनीक का उपयोग नहीं कर सकता।
निष्कर्ष के तौर पर
किसी भी मदद के लिए धन्यवाद!