शुरू और अंत पत्रों के मिलान के साथ शब्दों की सबसे लंबी सूची


11

मेरे दोस्त ने मुझे एक समस्या दी जो वह कहता है कि यह आसान है, लेकिन मैं इसे करने के लिए एक अच्छे एल्गोरिदम का पता नहीं लगा सकता।

आपको 100 यादृच्छिक अंग्रेजी शब्दों का इनपुट दिया गया है। आपको शब्दों की सबसे लंबी स्ट्रिंग ढूंढनी होगी जहां एक शब्द में अंतिम अक्षर अगले शब्द में पहले अक्षर से मेल खाता है। आप केवल एक बार प्रत्येक शब्द का उपयोग कर सकते हैं।

उदाहरण के लिए, यदि आपको "बिल्ली", "कुत्ता", "वह" शब्द दिए गए, तो आप जो सबसे लंबा तार लगा सकते हैं, वह "बिल्ली -> वह" होगा। यदि आपको "माउस", "मूस", "यूनिकॉर्न" शब्द दिए गए हैं, तो आप जो सबसे लंबा तार बना सकते हैं, वह सिर्फ एक शब्द होगा (क्योंकि उन शब्दों में से कोई भी लिंक नहीं है)। यदि आपको "पक्षी", "डिश", "हर्ब" शब्द दिए गए, तो आप जो सबसे लंबा तार बना सकते हैं वह "हार्ब -> पक्षी -> डिश" (या "डिश -> हार्ब -> पक्षी" या "पक्षी -" होगा > पकवान -> हर्ब ")।

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

+-------+         \ +------+
|  cat  |-----------| that |
+-------+         / +------+
    |                  |
   \|/                 |
+-------+ /            |
|  the  |--------------+
+-------+ \

यह समस्या सबसे लंबी पथ खोज है , जो एनपी-हार्ड है।

इसे करने का कोई बेहतर तरीका है? या यहां तक ​​कि किसी प्रकार के अनुमानित एल्गोरिथ्म का उपयोग किया जा सकता है? या खोज स्थान को कम करने के लिए अंग्रेजी के गुणों का दोहन करने का कोई तरीका?


4
100 शब्दों के साथ, आपको मिलता है (कम से कम) 100! = 9.332622e + 157 संयोजन। इसके साथ सौभाग्य, मुझे लगता है कि आपका दोस्त यह कहते हुए आपके पैर खींच रहा है कि यह आसान है।
मार्टिन विकमैन

1
लेकिन, संभावित संयोजनों की संख्या इससे बहुत कम है, क्योंकि औसतन एक शब्द केवल 6 या 7 अन्य शब्दों से जुड़ा हुआ है।
अबे टूल

2
आप सही हैं कि यह वास्तव में सबसे लंबा रास्ता खोज है। मुझे लगता है कि आपका दोस्त गलत है। हालाँकि, एक संपूर्ण खोज कोड के लिए कठिन नहीं है, और यह सब लंबे समय तक नहीं चल सकता है।
केविन क्लाइन

4
बस मज़े के लिए, मैंने रूबी ( brist.github.com/anonymous/6225361 ) में एक क्रूर बल निकास खोज (जैसा कि @kevincline ने बताया) को कोडित किया । 100 शब्दों के साथ, इसमें केवल ~ 96 सेकंड ( gist.github.com/anonymous/6225364 ) लगे। और यह एक अत्यधिक अक्षम, संयुक्त राष्ट्र-अनुकूलित, व्याख्या-भाषा, त्वरित और गंदी स्क्रिप्ट थी। तो केवल 100 शब्दों के साथ भी जानवर बल का एक धीमा संस्करण समय की एक मात्रा में चलता है। मेरा कोड वास्तव में एक चक्रीय ग्राफ नहीं बनाता है और फिर इसके माध्यम से खोज करता है, यह बस पुनरावृत्ति करता है प्रत्येक शब्द से शुरू होने वाले हर संभव पथ का निर्माण करता है, और सबसे लंबे समय तक का ट्रैक रखता है।
बेन ली

3
समस्या बताती है कि 100 शब्द हैं। मुझे लगता है कि इसका मतलब है कि आप एक गतिशील प्रोग्रामिंग समाधान लागू कर सकते हैं, जिसका उल्लेख उस लेख में किया गया है जिसका आप उल्लेख कर रहे हैं।
जुलिएन गुर्टॉल्ट

जवाबों:


5

मुझे लगता है कि यह सबसे लंबे पथ (एलपी) समस्या से संबंधित है जिसका आपने उल्लेख किया है, लेकिन यह थोड़ा अलग है। प्राथमिक अंतर यह है कि एलपी समस्या में आपके सुझाए गए समस्या की तुलना में कनेक्टिविटी की एक उच्च डिग्री है। अपने कनेक्शनों को अंतिम और पहले अक्षरों तक सीमित करके, आप बड़ी संख्या में संभावित संयोजनों को हटा देते हैं।

यहां बताया गया है कि मैं इससे निपटने की सिफारिश कैसे करूंगा:

  1. सूची में प्रत्येक शब्द के लिए, संभावित कनेक्शन को अंदर और बाहर से गिनें।
  2. किसी भी ऐसे शब्द को छोड़ दें, जिसमें 0 इन्स और 0 आउट्स है।
  3. सबसे कम संख्या वाले ins और outs के साथ "स्टार्टर शब्द" के एक शुरुआती सेट को पहचानें, और बाहरी 0 से अधिक होना चाहिए।
  4. प्रत्येक स्टार्टर शब्द इन्स / बाहरी कनेक्शन काउंट की अपनी कार्यशील प्रति प्राप्त करता है। यह श्रृंखला के प्रमुख बनाता है।
  5. प्रत्येक श्रृंखला के लिए, "अगले शब्दों" की एक सूची की पहचान करें:
    • स्टार्टर या पिछले शब्द का अंतिम अक्षर
    • इन्स की सबसे कम संख्या और बाहरी कनेक्शन (फिर से, बाहरी 0 से अधिक होना चाहिए)
  6. प्रत्येक के लिए next word, श्रृंखला समाप्त होने तक चरण 5 को दोहराएं।

ध्यान रखें कि:

  • आपको सबसे लंबी श्रृंखला की पहचान करने के लिए जंजीरों की लंबाई का ध्यान रखना होगा और कुछ वैश्विक तंत्र की आवश्यकता होगी।

  • पुनरावर्ती लूप से बचने के लिए आपको कनेक्शन की गणना की कार्य प्रति से प्रत्येक शब्द को निकालना होगा।

  • कुछ बिंदु पर, आपकी श्रृंखला समाप्त हो जाएगी और आपको 0 कनेक्शन आउट काउंट के साथ एक शब्द का चयन करना होगा।

  • जब आप कार्य सूचियों से शब्द हटाए जाते हैं, तो आपको ins / outs को पुनर्गणना करना पड़ सकता है। पहली नज़र में, मुझे नहीं लगता कि यह आवश्यक होगा क्योंकि समग्र सेट अपेक्षाकृत छोटा होगा। यदि आपने 1000 शब्दों को स्केल किया है, तो स्टेटिक काउंट होने से एल्गोरिथ्म को कंवर्जन करने से धीमा हो सकता है।

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

उदहारण के लिए:

{dog, gopher, alpha, cube, elegant, this, that, bart}

dog     0, 1
gopher  1, 0
alpha   0, 0
cube    0, 1
elegant 1, 2
this    3, 0
that    2, 1
bart    0, 2

//alpha is dropped with 0 in and 0 out.
//two candidates found: dog, cube

//chain 1
dog => gopher
//chain 2
cube => elegant => that => this

//Note 1: the following chain won't occur due to selection rules
//that takes priority over this because of output count
cube => elegant => this

//Note 2: this chain won't occur either due to selection rules
bart => that => this

2
क्या कोई गारंटी है कि यह एल्गोरिथम हमेशा सबसे लंबा रास्ता खोजेगा? मेरे सिर के ऊपर, मैं एक काउंटर-उदाहरण के बारे में नहीं सोच सकता, लेकिन ऐसा लगता है कि यह "स्थानीय अधिकतम" प्रकार के समाधान के लिए गिर सकता है।
बेन ली

@ बेनीली - मैं एक सॉफ्टवेयर इंजीनियर हूँ; मैं कभी अपने कोड की गारंटी नहीं देता। :-) गंभीरता से, मुझे आपके सवाल का जवाब नहीं पता। मेरा सेट सिद्धांत और गणितीय प्रमाण कौशल कमजोर हैं, इसे हल्के ढंग से रखने के लिए, इसलिए मेरे पास अपने एल्गोरिथ्म को मान्य करने के लिए अनुभवजन्य मूल्यांकन से परे कोई रास्ता नहीं है। मुझे यकीन नहीं है कि यह समस्या वास्तव में एनपी-हार्ड है, लेकिन मैं उस दावे को मान्य नहीं कर सकता। यदि यह एनपी-हार्ड नहीं है, तो एल्गोरिथ्म को मान्य करने का एक साधन होना चाहिए।

2
इस तरह से एक शब्द सूची के बारे में क्या: "कुत्ता, गोफर, बन, नन, दोपहर, नूब"। एल्गोरिथ्म गलत तरीके से "कुत्ते -> गोफर" के रूप में सबसे लंबी सूची को ले जाएगा, जब यह वास्तव में "बन, नन, नून, नूब" का कोई संयोजन है।
अबे टूल

1
@AbeTool - वहाँ अच्छा उदाहरण है। मैं "सबसे कम इनपुट> = 1" और "सबसे कम आउटपुट> = 1" संयोजन के लिए अनुमति देने के लिए एक और पुनरावृति (या दो) जोड़ूंगा।

2
मुझे नहीं लगता कि यह सभी मामलों में समस्या को हल करने वाला है। मुझे लगता है कि यह "स्थानीय अधिकतम" प्रकार के समाधान में आता है।
अबे टूल

3

यदि आप प्रत्येक वर्णमाला और किनारे के रूप में वर्टेक्स के निर्देशित ग्राफ का प्रतिनिधित्व करने के लिए 26X26 मैट्रिक्स बनाते हैं। उदाहरण के लिए शब्द - APPLE कनेक्ट A से E तक निर्देशित किनारे के साथ A और E को कनेक्ट करें। अब समस्या सबसे बड़े Eulerian ट्रेल (पथ जिसमें किनारों की अधिकतम संख्या शामिल है, को खोजने के लिए कम करती है) ग्राफ़ में एक बार पुनरावृत्ति को संभव बनाते हुए)। O (E) एल्गोरिथ्म में से एक बेतरतीब ढंग से एक जोड़ी से शुरू करना होगा। उनके बीच का रास्ता खोजें। जब तक संभव न हो, तब तक आराम करते रहें।

अद्यतन @ GlenH7 मैंने हाल ही में www.hackerearth / jda पर एक समान प्रश्न हल किया, सर्वश्रेष्ठ समाधान के संबंध में सापेक्ष अंक थे और मैंने निम्नलिखित अंकों के साथ उच्चतम अंक बनाए-

शब्दों की सूची दी। सबसे लंबी श्रृंखला खोजें जो उनके द्वारा बनाई जा सकती है। एक श्रृंखला वैध है यदि हर शब्द एक अक्षर से शुरू होता है * अंतिम शब्द के अंत में समाप्त होता है।

दृष्टिकोण =

1) अक्षरों और किनारों के रूप में अक्षर का ग्राफ बनाते हैं। कई किनारों का उपयोग करने के स्थान पर किनारों की संख्या के बराबर वजन के साथ एक का उपयोग करें।

2) अधिकतम किनारों के साथ ग्राफ के दृढ़ता से जुड़े घटक को खोजें। अस्थायी रूप से अन्य किनारों को त्यागें।

3) प्रत्येक शीर्ष के लिए अपनी जागीर को उसकी रूपरेखा के बराबर बनाते हैं।

4) अब ग्राफ में उनके यूलरियन सर्किट मौजूद हैं। इसे खोजें।

5) अब बचे हुए ग्राफ (wrt orignal graph में सबसे लंबे निशान के साथ सबसे पहले चुने गए मजबूती से जुड़े घटक को ढूंढते हैं। मुझे लगता है कि यह NP कठिन है।

6) एलरियन सर्किट में उपरोक्त निशान को शामिल करें यूलरियन सर्किट को ट्रेल में परिवर्तित करना।

क्यों - मैं स्वीकार करता हूं कि यह सवाल शायद एनपी कठिन है (अनुमान, गणितीय रूप से नहीं)। लेकिन उपरोक्त दृष्टिकोण सबसे अच्छा काम करता है जब समान रूप से वितरित शब्दों की एक लंबी सूची (1000+) होती है (यानी दृष्टिकोण के लिए wc होने का इरादा नहीं)। आइए मान लें कि दी गई सूची को ऊपर बताए गए ग्राफ में परिवर्तित करने के बाद, यह सौभाग्य से एक यूलरियन ग्राफ बन जाता है (देखें http://en.wikipedia.org/wiki/Eulerian_path शर्तों के लिए), फिर बिना किसी संदेह के हम यह कह सकते हैं कि उत्तर उपरोक्त प्रश्न P है और वास्तव में ग्राफ़ में यूलरियन पथ है ( ऐसा करने के लिए एक बहुत ही सरल दृष्टिकोण के लिए http://www.graph-magics.com/articles/euler.php देखें ( यह देखें कि आपके ग्राफ़ में यह सत्यापित करने के लिए है) एकल http://www.geeksforgeeks.org/strongly-connected-compenders/और यदि अस्थायी रूप से अन्य छोटे एससीसी को साफ न करें, क्योंकि एकल एससीसी के लिए यूलरियन पथ मौजूद है)। इस प्रकार भाग्यशाली मामलों के लिए (जो लगभग सभी मामले हैं) मैं उन्हें भाग्यशाली मामलों में बदलने की कोशिश करता हूं (यानी यूलरियन ट्रेल की स्थिति पूरी होती है)। यह कैसे करना है? मैंने अप्रासंगिक किनारों के लिए गहराई से खोज करने की कोशिश की (एक मार्ग में किनारों का सेट, जो कि शीर्ष से अधिक मंदक के साथ घनीभूत से अधिक था और शिखर पर चरम से अधिक के साथ समाप्त होता है)। गहराई से खोज बढ़ाने का मतलब है कि पहले मैंने रास्ते में एक किनारे के ऐसे सभी सेट की खोज की, जो कि दो किनारों की तुलना में पथ पर था। यह पहली बार में लग सकता है कि ith गहराई खोज O (नोड्स ^ i) लेगी, इस प्रकार O की कुल समय जटिलता (नोड्स + नोड्स ^ 2 + नोड्स ^ 3 + ....) जब तक यह एक भाग्यशाली मामला नहीं है। लेकिन परिशोधित विश्लेषण यह ओ (किनारों) होगा। एक बार जब यह कम हो जाता है तो भाग्यशाली मामला यूलरियन सर्किट का पता चलता है।

यहाँ तक यह सभी बहुपद समय था। यह लगभग सबसे अच्छा समाधान देगा। लेकिन अपने समाधान को और बढ़ाने के लिए (सही समाधान एनपी कठिन है) चुने हुए सीसी में एक कोने के साथ एक लंबे निशान को खोजने के लिए शेष ग्राफ में कुछ लालची दृष्टिकोण की कोशिश करें। अब इसे ऊपर पाए गए यूलरियन ट्रेल में जोड़ें ताकि इसे और बढ़ाया जा सके।


@ GlenH7 मैंने हाल ही में www.hackerearth / jda पर इसी तरह के प्रश्न को हल किया, सर्वश्रेष्ठ समाधान के संबंध में सापेक्ष अंक थे और मैंने निम्नलिखित अनुमोदन के साथ उच्चतम अंक बनाए-
vishfrnds

0

विचार:

सबसे पहले, वर्णमाला अक्षरों से शब्दों तक दो नक्शे (हैश), एस, और ई बनाएं; पहला, S, शब्दों के लिए अक्षर शुरू करने वाले नक्शे, दूसरा, E, अक्षरों को समाप्त करने के साथ ही करता है।

जैसे, यदि शब्दकोष बना है:

पक्षी, पकवान, कुत्ता, हर्ब

हमारे पास है:

S:

a -> [ ]
b -> [ bird ]
c -> [ ]
d -> [ dish, dog ]
...
h -> [ harb ]
...

तथा,

E:

a -> [ ]
b -> [ harb ]
c -> [ ]
d -> [ bird ]
...
g -> [ dog ]
h -> [ dish ]
...

अगला, एस और ई का उपयोग तेजी से देखने के लिए, एक जंगल (पेड़ों का सेट) बनाएं, शब्दकोश के समान आकार, प्रत्येक शब्द पर जड़ों के साथ, और एक शब्द को पेड़ में एक से अधिक बार दिखाई देने की अनुमति न दें - कैश आपके द्वारा निर्माण के दौरान पेड़ों की गहराई:

bird (depth: 2)
   dish
      harb
   dog

dish (depth: 3)
   harb
      bird
         dog

dog (depth: 0)

harb (depth: 2)
   bird
      dish
      dog

अंत में, जंगल पर पुनरावृति और सबसे बड़ी गहराई के पेड़ (पेड़) पाते हैं।

समाधान (एस) उन पेड़ों के वंशज धुरी पर होंगे।

उदाहरण के लिए,

dish / harb / bird / dog

ऊपर।

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