सबसे लंबे समय तक दोहराव का पता लगाना


9

एक स्ट्रिंग को देखते हुए , मैं सबसे लंबे समय तक दोहराए जाने (कम से कम दो बार) बाद में खोजना चाहूंगा। है कि, मैं एक स्ट्रिंग प्राप्त करना चाहते हैं जो किसी परिणाम है की (एक आस पास होने की जरूरत नहीं है) ऐसी है कि डब्ल्यू डब्ल्यू '\ सी-डॉट डब्ल्यू' = । यही है, w एक स्ट्रिंग है जिसकी संख्या पंक्ति में दो बार दिखाई देती है। ध्यान दें कि डब्ल्यू की किसी परिणाम है रों जरूरी सबस्ट्रिंग, लेकिन नहीं।swsw=wwwwरों

उदाहरण:

'Ababccabdc' के लिए यह 'abcabc' होगा, क्योंकि 'abcccabdc' में 'abc' = 'abc' और 'abc' कम से कम दो बार दिखाई देते हैं।

'Addbacddabcd' के लिए एक विकल्प 'dddd' है, क्योंकि 'dd' दो बार दिखाई देता है (मैं एक ही अक्षर का कई बार उपयोग नहीं कर सकता, लेकिन यहाँ मेरे पास 4 'd's so ok' है), लेकिन इसका शब्दांश 4. मैं एक बेहतर खोज सकता हूँ। लंबाई 8: 'abcdabcd', क्योंकि 'abcd' 'addbacddabcd' का एक विकल्प है जो दो बार दिखाई देता है।

मैं सबसे लंबे समय तक दोहराव खोजने में रुचि रखता हूं। इसे "सबसे लंबा / सबसे बड़ा वर्ग ढूंढना" भी कहा जाता है, लेकिन मैंने कई लेख पढ़े हैं जिसमें एक वर्ग को एक विकल्प के लिए परिभाषित किया गया है और बाद के लिए नहीं।

मैं आसानी से एक क्रूर बल एल्गोरिथ्म का उपयोग कर सकता हूं जो स्ट्रिंग में एक ब्रेकपॉइंट के लिए सभी विकल्पों पर पुनरावृत्ति करके ओ (एन ^ 3) ले जाएगा हे(n3), और फिर मेरे पास दो तार होंगे जिसमें मैं सबसे बड़ा / सबसे लंबा सामान्य बाद की तलाश करूंगा, लेकिन प्रत्येक चेक एक गतिशील प्रोग्रामिंग तकनीक का उपयोग करके हे(n2) लेगा, इसलिए पूरा समय हे(n3) । मुझे सबसे लंबे समय तक चलने वाली सामान्य अनुक्रिया के लिए एक अधिक कुशल एल्गोरिथ्म मिला जो O (\ frac {n ^ 2} {\ log n}) लेता है हे(n2लॉगn), इसलिए चलने का समय हे(n3लॉगn)

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

मैंने कई पत्रिकाओं और पिछले प्रश्नों में खोज की है, और मैंने जो परिणाम प्राप्त किए हैं उनमें से अधिकांश एक विकल्प के बारे में थे और एक बाद के बारे में नहीं।

मैंने यह भी पढ़ा है कि यह प्रत्यय पेड़ों का उपयोग करके किया जा सकता है, लेकिन यह भी सबस्ट्रिंग के लिए प्रासंगिक था और मुझे यकीन नहीं है कि इस तरह के विचार को बाद के लिए बढ़ाया जा सकता है।

मैं एक समाधान की तलाश में हूं जो समय में चलता है । यदि कोई समय जो और भी बेहतर होगा (मुझे यकीन नहीं है कि ऐसा मौजूद है)।हे(n2)हे(nलॉगn)


4
प्रत्यय पेड़ या प्रत्यय सरणियों को देखें।
छद्म नाम

1
यह बहुत कम संभावना नहीं है कि इस समस्या के लिए एक -टाइम एल्गोरिथ्म मौजूद है, क्योंकि अगर यह किया है, तो आप इसका उपयोग दो ज्ञात लंबाई - स्ट्रिंग्स और के LCS खोजने के लिए सबसे अच्छा ज्ञात एल्गोरिथ्म को हरा करने के लिए कर सकते हैं : स्ट्रिंग फार्म , जहां है एक चरित्र की प्रतियां है कि या तो में प्रकट नहीं होता या , और फिर अपने को चलाने उस पर टाइम एल्गोरिथ्म। दोनों सबसे लंबे समय तक दोहराव के "पड़ाव" जरूरी साथ शुरू होंगे , इसलिए प्रत्येक और से एक आधा आता हैo(n2)nuvxuxvएक्सn+1$यूv(n2)एक्सयूv, LCS समस्या को हल करना।
j_random_hacker

@j_random_hacker LCS को रोलिंग गणित के उपयोग से प्रत्यय ट्री या उपयोग करके में हल किया जा सकता है । हे(n+)हे(nलॉगn)
ईविल

@ ईविल: मैं अभी तक नहीं देखता कि कैसे, आप थोड़ा और विस्तार दे सकते हैं? (क्या आप सुनिश्चित हैं कि आप
लॉन्गेस्ट

@j_random_hacker मुझे लगा कि आप LCS (लगातार साथ उद्देश्य तुलना कर रहे हैं , लेकिन यहाँ, जैसा कि आपने उल्लेख किया है, हाँ, मैंने अभी तक n ^ 2 में सबसे लंबे समय तक काम के लिए समाधान नहीं देखा है (मैंने पाया है) एक गतिशील प्रोग्रामिंग कोड, कई पृष्ठों पर प्रचारित किया गया है, जो त्रुटिपूर्ण है, उत्तर के समान है)। तो बस मुझे आपकी टिप्पणी गलत लगी, क्षमा करें। (n2)
ईविल

जवाबों:


-1

यहाँ एक गतिशील प्रोग्रामिंग समाधान है।

मान लीजिए कि इनपुट स्ट्रिंग । एक तालिका बनाएँ, जिसकी पंक्तियों और स्तंभों को (जहां स्ट्रिंग की लंबाई है) द्वारा अनुक्रमित किया जाता है जिसे नियम द्वारा नियम से पॉप्युलेट किया गया है उत्तर ।x1xnT0,,nn

टी[मैं,जे]={0अगर मैं=0 या जे=0,टी[मैं-1,जे-1]+1अगर एक्समैं=एक्सजे तथा मैंजे,अधिकतम(टी[मैं-1,जे],टी[मैं,जे-1])अन्यथा
टी[n,n]

मान लीजिए कि हम कुछ साथ , और आपके कथन में शर्त सत्य है। फिर तात्पर्य यह है कि स्थिति दोनों वर्णों का हिस्सा है। मैं,जेमैं=जे+1ifdp[i][j] = dp[i - 1][j - 1] + 1मैं-1=जे
j_random_hacker

3
कंप्यूटर विज्ञान में आपका स्वागत है! कृपया स्रोत कोड से छुटकारा पाएं और इसे विचारों, छद्म कोड और शुद्धता के तर्कों के साथ बदलें। संबंधित मेटा चर्चाओं के लिए यहां और यहां देखें ।
राफेल

@ रिपेल एक पुनरावर्ती सूत्र स्रोत कोड के रूप में नहीं गिना जाता है।
नंबर

1
@BreakingBenjamin अपनी पसंद की भाषा के आधार पर, आप दिए गए पुनरावृत्ति को कम या ज्यादा अक्षरशः लिख सकते हैं। मुद्दा यह है कि यहां कोई स्पष्टीकरण नहीं है।
राफेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.