प्रत्यय सरणियों का उपयोग करते हुए दो तारों के सबसे लंबे सामान्य प्रतिस्थापन की गणना करना


15

जब मैंने जटिलता में एक प्रत्यय सरणी का निर्माण करना सीख लिया , तो मुझे प्रत्यय सरणियों के अनुप्रयोगों की खोज करने में दिलचस्पी है। इनमें से एक समय में, दो तारों के बीच सबसे लंबे समय तक सामान्य प्रतिस्थापन का पता लगा रहा है । मैंने इंटरनेट पर निम्न एल्गोरिथम पाया:O(N)O(N)

  1. दो स्ट्रिंग और को एक स्ट्रिंग में मर्ज करेंABAB
  2. की प्रत्यय सरणी की गणना करेंAB
  3. (सबसे लंबे समय तक सामान्य उपसर्ग) सरणी की गणना करेंLCP
  4. उत्तर का सबसे बड़ा मूल्य हैLCP[i]

मैंने इसे लागू करने की कोशिश की, लेकिन जैसा कि कई कार्यान्वयन विवरणों में नहीं कहा गया था (यानी जब तारों को , मुझे उनके ( ) के बीच एक विशेष चरित्र डालना चाहिए ?), कई परीक्षण मामलों पर मेरा कोड विफल हो गया। क्या कोई इस एल्गोरिथम पर अधिक विस्तार कर सकता है?AcB

अग्रिम में धन्यवाद।

नोट: मैं इस एल्गोरिथ्म की शुद्धता की गारंटी नहीं देता; मैंने इसे एक ब्लॉग पर पाया, और मुझे यकीन नहीं है कि यह काम कर रहा है। यदि आपको लगता है कि यह गलत है, तो कृपया अन्य एल्गोरिदम का सुझाव दें।


3
एल्गोरिथ्म को लागू करने से पहले, यह समझने की कोशिश करें कि यह क्यों काम करता है। यह एक सवाल का जवाब देने में मदद कर सकता है जैसे कि दो तारों को कैसे जोड़ना है।
युवल फिल्मस

3
मुझे इस एल्गोरिथ्म की शुद्धता पर संदेह है। और लें , जिस तरह से मैंने इसे पढ़ा है वह को लौटा देगा , जो कि गलत है। बी सी डी बी सी डीabcdabcdbcdabcd
खुर

जवाबों:


20

आपका एल्गोरिथ्म गलत है । मुझे लगता है कि आपको पता है कि प्रत्यय सरणी और एक स्ट्रिंग के LCP सरणी की गणना कैसे की जाती है, अर्थात् उनका कुशल कार्यान्वयन। जैसा कि टिप्पणियों में बताया गया है, आपको यह समझने की कोशिश करनी चाहिए कि प्रत्येक घटक क्या है, और यह क्यों काम करता है।

सबसे पहले, एक स्ट्रिंग का प्रत्यय सरणी ( ) है। प्रत्यय सरणी मूल रूप से एस के सभी प्रत्यय हैं जो आरोही लेक्सिकोग्राफिक क्रम में व्यवस्थित होते हैं। विशेष रूप से, मूल्य एस [ मैं ] इंगित करता है कि प्रत्यय एस स्थिति से शुरू एस [ मैं ] स्थान दिया गया है मैं के सभी प्रत्यय कोषगत आदेश में एसSASSA[i]SSA[i]iS

अगला सरणी है। L C P [ i ] S A [ i - 1 ] और S A [ i ] से शुरू होने वाले प्रत्ययों के बीच सबसे लंबे सामान्य उपसर्ग की लंबाई को इंगित करता है । यही है, यह लेक्सिकोग्राफिक क्रम में व्यवस्थित होने पर एस के दो लगातार प्रत्ययों के बीच सबसे लंबे सामान्य उपसर्ग की लंबाई का ट्रैक रखता है ।LCPLCP[i]SA[i1]SA[i]S

एक उदाहरण के रूप में, स्ट्रिंग । कोषगत क्रम में प्रत्यय होगा { एक , एक एक एक , एक एक , एक एक , एक एक , एक , एक } , तो एस = [ 7 , S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca}1-अनुक्रमित सरणी के लिए , 4 , 3 , 2 , 5 , 6 ]एल सी पी सरणी होगा एल सी पी = [ - , 1 , 2 , 0 , 1 , 1 , 0 ]SA=[7,1,4,3,2,5,6]LCPLCP=[,1,2,0,1,1,0]

अब, और B को दो तार दिए गए हैं , हम उन्हें S = A # B के रूप में सम्‍मिलित करते हैं , जहाँ # एक ऐसा चरित्र है जो A और B दोनों में मौजूद नहीं है । इस तरह के चरित्र को चुनने का कारण यह है कि दो प्रत्ययों के LCP की गणना करते समय, एक b # d a b d और a b d कहें , तुलना पहली तार के अंत में टूट जाएगी (क्योंकि यह केवल एक बार होती है, दो अलग-अलग प्रत्ययों में कभी भी एक ही स्थिति में नहीं होगा), और दूसरे स्ट्रिंग में "अतिप्रवाह" नहीं होगा ।ABS=A#B#ABab#dabdabd

अब, यह देखा जा सकता है कि आपको यह देखने में सक्षम होना चाहिए कि आपको केवल सरणी में लगातार मूल्यों को देखने की आवश्यकता क्यों है (यह तर्क विरोधाभास पर आधारित है और तथ्य यह है कि एस में प्रत्यय शाब्दिक क्रम में हैं)। अधिकतम मान के लिए L C P सरणी की जाँच करते रहें , ताकि दोनों प्रत्ययों की तुलना एक ही मूल स्ट्रिंग से न हो। यदि वे एक ही मूल स्ट्रिंग से संबंधित नहीं हैं (एक और दूसरे बी में शुरू होता है ), तो सबसे बड़ा ऐसा मूल्य सबसे बड़े सामान्य विकल्प की लंबाई है।LCPSALCPAB

एक उदाहरण के रूप में, और B = b c पर विचार करें । फिर, S = a b c a b c # b c । सॉर्ट किए गए प्रत्यय हैं { a b c # b c , a b c a b c # b c , b c , b c # b c , b c aA=abcabcB=bcS=abcabc#bcएस {abc#bc,abcabc#bc,bc,bc#bc,bcabc#bc,c,c#bc,cabc#bc}
SA=[4,1,8,5,2,9,6,3,7]LCP=[,3,0,2,2,0,1,1,0]

अब, सबसे बड़ा मान , लेकिन यह S A [ 1 ] और S A [ 2 ] के लिए है , दोनों स्ट्रिंग A में शुरू होते हैं । इसलिए, हम इसे अनदेखा करते हैं। दूसरी ओर, एल सी पी [ 4 ] = 2 के लिए है एस [ 3 ] (प्रत्यय से मेल खाती है की बी ) और एस [ 4 ]LCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bcBSA[4](प्रत्यय करने के लिए इसी की एक )। तो, यह दो तारों के बीच सबसे लंबा सामान्य प्रतिस्थापन है। वास्तविक सबरिंग प्राप्त करने के लिए, आप S A [ 3 ] या S A [ 4 ] , जो b c है, से शुरू करने के लिए एक लंबाई 2 (सबसे बड़ी संभव L C P का मान ) लेते हैं ।bcabc#bcA2 LCPSA[3]SA[4]bc


1
बहुत बढ़िया स्पष्टीकरण लेकिन मुझे लगता है उदाहरण के एक सा गलत है, हल कर प्रत्यय हैं: {#bc,abc#bc,abcabc#bc,bc,bc#bc,bcabc#bc,c,c#bc,cabc#bc}, SA=[7,4,1,8,5,2,9,6,3]औरLCP=[−,0,3,0,2,2,0,1,1]
Saúl Martínez Vidals

1

आपके द्वारा ऑनलाइन प्राप्त एल्गोरिथ्म पूरी तरह से सही नहीं है। जैसा कि परेश ने कहा है, यह उनके द्वारा दिए गए उदाहरण में विफल होगा।

हालाँकि, यदि आप यह सुनिश्चित करते हैं कि LCP की जाँच करते समय, आप केवल विभिन्न स्ट्रिंग्स के LCP की जाँच करते हैं। उदाहरण के लिए, यदि आप स्ट्रिंग्स A और B का LCS पा रहे हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि LCP की जाँच करते समय Suffix Array की आसन्न प्रविष्टियाँ दोनों एक ही स्ट्रिंग से नहीं हैं।

अधिक जानकारी यहाँ


1
जब आप "यह उत्तर" कहते हैं, तो क्या आपका मतलब स्वयं का उत्तर है या कोई अन्य उत्तर है? कृपया प्रश्न का उत्तर देने के लिए केवल उत्तर बॉक्स का उपयोग करें, अन्य उत्तरों पर टिप्पणी करने के लिए नहीं। जब आप पर्याप्त प्रतिष्ठा प्राप्त कर लेते हैं, तो आप अन्य उत्तरों पर टिप्पणी छोड़ सकते हैं।
डेविड रिचेर्बी

0

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

यह भविष्य के रेफरी के लिए उपयोगी होगा यदि आपने एल्गोरिथ्म के लिए एक लिंक पोस्ट किया है। ध्यान दें कि विकिपीडिया के पास छद्मकोड और कई अन्य एल्गोरिदम में इसके लिए एल्गोरिदम है। और ऑनलाइन उपलब्ध अधिकांश मानक भाषाओं में कार्यान्वयन हैं।

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