एन स्ट्रिंग्स को देखते हुए, क्या उनमें से एक दूसरे का विकल्प है?


9

मान लीजिए कि हमें एक संग्रह दिया गया है n तार, S1,,Sn। मैं जानना चाहूंगा कि क्या उनमें से कोई तार संग्रह में किसी अन्य स्ट्रिंग का एक विकल्प है। दूसरे शब्दों में, मैं निम्नलिखित कार्य के लिए एक एल्गोरिथ्म चाहूंगा:

इनपुट: S1,,Sn

आउटपुट: i,j ऐसा है कि Si का एक विकल्प है Sj तथा ij, या कोई नहीं तो ऐसे नहीं i,j मौजूद

क्या इसके लिए एक कुशल एल्गोरिदम है?

यदि हम "सबस्ट्रिंग" को "उपसर्ग" से प्रतिस्थापित करते हैं, तो एक कुशल एल्गोरिथ्म है (तार को क्रमबद्ध करें, फिर आसन्न तारों की तुलना करने के लिए एक रैखिक स्कैन करें। छंटाई यह सुनिश्चित करेगी कि सबस्ट्रिंग आसन्न हैं)। लेकिन यह परीक्षण करना अधिक चुनौतीपूर्ण लगता है कि क्या कोई स्ट्रिंग किसी अन्य स्ट्रिंग का एक विकल्प है। एक भोली एल्गोरिथ्म सभी जोड़ियों पर चलना हैi,j, लेकिन इसके लिए आवश्यकता है Θ(n2)घटिया परीक्षण। क्या अधिक कुशल एल्गोरिथ्म है?

मुझे लगता है कि हम इसे "ऑल-पेयर सबस्ट्रिंग टेस्टिंग" कह सकते हैं, या ऐसा कुछ।

मेरा अंतिम लक्ष्य संग्रह को prune करना है, इसलिए कोई भी स्ट्रिंग किसी अन्य का एक विकल्प नहीं है, प्रत्येक को हटाकर जो संग्रह में किसी और चीज का विकल्प है।


संकेत: प्रत्यय सरणी।
छद्म नाम

अलग नोट के रूप में, Θ(n2)यह सही नहीं है यदि आप सब्सट्रिंग्स को हटाते हैं जैसा कि आप उन्हें ढूंढते हैं। यह कम होगा। इसके अलावा, आपको लंबाई के आधार पर छाँटना चाहिए क्योंकि लंबी स्ट्रिंग छोटी स्ट्रिंग में दिखाई नहीं दे सकती है। फिरΘ(n2)यहाँ गलत है
एलेक्सिस विलके

@AlexisWilke, Θ(n2)सही है: यह सबसे खराब स्थिति में प्रतिस्थापन परीक्षणों की संख्या है (सबसे खराब स्थिति यह है कि कोई स्ट्रिंग किसी अन्य का विकल्प नहीं है)। लंबाई के आधार पर छाँटने से आपको केवल दो का एक कारक मिलता है, जो कि एसिम्पोटिक्स को प्रभावित नहीं करता है।
डीडब्ल्यू

जवाबों:


6

आप रैखिक समय में एक प्रत्यय के पेड़ का निर्माण कर सकते हैं और जांच सकते हैं कि क्या एक आंतरिक नोड है जो एक पूर्ण स्ट्रिंग (प्रति नोड निरंतर समय) से मेल खाती है।

अधिक विस्तार से, मान लें कि हमें तार दिए गए हैं s1,,snΣ

  1. एक (सामान्यीकृत) का निर्माण प्रत्यय पेड़ कीs1$1,s2$2,,sn$n साथ में n जोड़ीदार अलग टर्मिनल मार्कर $1,,$nΣ

    उकोकोन के एल्गोरिथ्म का उपयोग करना , यह रैखिक समय में किया जा सकता है; सभी स्ट्रिंग लंबाई के योग में रैखिक।

  2. यह मानते हुए कि आप लेबल छोड़ते हैं (i,j) यदि वे प्रत्यय का प्रतिनिधित्व करते हैं si[j..|si|] का si, पेड़ को तोड़ो और उन लोगों को ढूंढो n लेबल वाले पत्ते (i,0), यानी पत्तियां जो पूर्ण तारों से मेल खाती हैं।

    पेड़ के आकार में यह समय रैखिक होता है, जो इनपुट आकार में स्वयं रैखिक होता है।

  3. के माता-पिता के वंशज (i,0) (जो लेबल वाले किनारे तक पहुँच जाता है $i) सेट से सभी मैचों का प्रतिनिधित्व करते हैं; यह प्रत्यय वृक्षों के मूल अक्रिय से है। किसी भी पत्ती के नीचे उतरकर कोई एक मैच खोजें (लेकिन(i,0))।

    यह फिर से रैखिक समय लेता है।

अलग-अलग टर्मिनल मार्कर वास्तव में आवश्यक नहीं हैं; सभी स्ट्रिंग्स को समाप्त करने के लिए उपयोग किया जाने वाला एक एकल तब तक पर्याप्त होता है जब तक आप प्रति पत्ते कई लेबल की अनुमति नहीं देते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.