2010-05-14 16 views
7

के एक सेट से इकट्ठा किया जा सकता है, तो कुशलता से पता लगाने के लिए कैसे मैं कॉलेज परियोजना के लिए स्क्रैबल के टेक्स्ट-आधारित संस्करण को कार्यान्वित कर रहा हूं।सी ++ - अक्षरों में किसी भी स्ट्रिंग को

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

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

शब्दकोश युक्त टेक्स्ट-फ़ाइल पहले ही वर्णानुक्रमित है, इसलिए वेक्टर सॉर्ट किया गया है।

कोई सुझाव?


नीचे दी गई टिप्पणियों में एक समस्या प्रस्तुत की गई: कोई सुझाव है कि मैं बोर्ड पर पहले से ही पत्र कैसे ले सकता हूं?

+1

तो सवाल यह वास्तव में "कैसे कुशलतापूर्वक एक वेक्टर से अधिक पुनरावृति करने के लिए" नहीं है, बल्कि "कैसे कुशलतापूर्वक पता लगाने के लिए अगर संग्रह में कोई भी शब्द पत्र का एक सेट से इकट्ठा किया जा सकता है?" – jalf

+1

आप अपनी समस्या के विवरण में ध्यान में नहीं लग रहे हैं कि शब्दों को बोर्ड के साथ-साथ खिलाड़ी के हाथ के आधार पर भी बनाया जा सकता है। – jemfinch

+0

ओह। मैं इसे ध्यान में नहीं ले रहा था। महान, अभी तक और अधिक जटिलता पहले से ही (मेरे ज्ञान के स्तर के लिए) जटिल समस्या –

उत्तर

8

आपको कोई विशिष्ट कोड (क्योंकि यह सब के बाद होमवर्क है) के बिना, वास्तविक कानूनी शब्दों में शब्द में क्रमबद्ध अक्षरों से मानचित्र पर विचार करने के लिए एक सामान्य दृष्टिकोण है।

कहना है कि, अपने शब्दकोश फ़ाइल केवल शब्दों ape थी, gum, और mug, अपने डेटा संरचना दिखाई देगा:

aep -> ape 
gmu -> gum, mug 

, तो आप बस खिलाड़ी के पत्र के क्रमपरिवर्तन के माध्यम से जा सकते हैं और जल्दी से पहचानें कि मानचित्र में वह कुंजी मौजूद है या नहीं।

आप स्टार्टअप पर शब्दकोश को सेट अप करने के लिए थोड़ी सी प्रोसेसिंग समय का भुगतान करते हैं, लेकिन फिर आपको हर बार पूरी सूची के माध्यम से फिर से कुछ त्वरित लुकअप करना पड़ता है।

+0

यह ठीक है कि मैं टाइपिंग की प्रक्रिया में था। –

+1

इस प्रकार जॉन बेंटले ने "प्रोग्रामिंग मोती" में अपने एनाग्राम पहचान/निर्माण एल्गोरिदम का वर्णन किया। यह भी गलत है: यह केवल उन शब्दों की पहचान करेगा जिन्हें * सभी * प्लेयर के अक्षरों के साथ बनाया जा सकता है। – jemfinch

+0

@jemfinch: निश्चित रूप से। –

1

आप स्ट्रिंग्स को एसएसडी :: सेट में ASCIIBetical ऑर्डर में क्रमबद्ध वर्णों के साथ स्टोर भी कर सकते हैं, फिर प्लेयर के अक्षरों को उसी क्रम में सॉर्ट करें और प्लेयर के अक्षरों के प्रत्येक सबस्ट्रिंग के लिए मानचित्र खोजें।

1

कैसे {शब्दकोश से शब्द, एक ही पत्र की स्ट्रिंग मिलकर लेकिन आरोही क्रम (क्रमबद्ध) में} जोड़े रखने

तो दूसरी स्ट्रिंग के आधार पर उन जोड़े के वेक्टर सॉर्ट और तुलना करें द्विआधारी खोज का उपयोग कर के बारे में खिलाड़ियों के हाथ से क्रमबद्ध अक्षरों वाली एक स्ट्रिंग के साथ।

2

सबसेट योग समस्या का एक परिवर्तन की तरह लगता है: http://en.wikipedia.org/wiki/Subset_sum_problem

हो सकता है कि वर्णित एल्गोरिदम के कुछ आप में मदद मिलेगी।

2

इस साइट पर स्क्रैबल पर कई कागजात और प्रश्न हैं।

कई रणनीतियां भी उपलब्ध हैं।

आपके शब्दकोश का प्रतिनिधित्व अपर्याप्त है, वहां बहुत चालाक विधियां उपलब्ध हैं।उदाहरण के लिए, जांचें कि ट्री विकिपीडिया पर क्या है।

इसका उपयोग करके आप यह निर्धारित करने के लिए एक बैकट्रैकिंग एल्गोरिदम लागू कर सकते हैं कि आप कौन से शब्द बना सकते हैं।

{'as', 'ape', 'gum'} 

Trie: 

void -a-> (n) -p-> (n) -e-> (y) 
       -s-> (y) 
    -g-> (n) -u-> (n) -m-> (y) 

जहां 'एन' का अर्थ है कि यह एक शब्द नहीं बनाता है और वाई का मतलब है कि यह करता है।

अब, आपको ट्री को चलना होगा, ध्यान रखें कि कौन से पत्र उपलब्ध हैं।

कहो तुम हो कि { 'एक', 'पी', 'जी', 'मी', 'यू'}: जब

1. I have a 'a' (but 'a' is not a word) 
2. I have a 'p' (but 'ap' is not a word) 
3. I don't have any 'e' so I can't go further, let's backtrack 
4. I don't have any 's' so... 
5. I have a 'g', but it's not a word 
6. I have a 'u', but 'gu' is not a word 
7. I have a 'm' and 'gum' is a word, I store it somewhere, I can't go further 

बिंदु उपलब्ध पत्र का एक सेट बनाए रखने के लिए है, आप -a-> शाखा लेते हैं, आप इस सेट से 'ए' हटाते हैं, फिर जब आप रिवर्स (बैकट्रैकिंग करते समय) लेते हैं- आप इसे सेट में वापस जोड़ते हैं।

  • यह संरचना, बहुत तेजी से और साथ ही और अधिक अंतरिक्ष कुशल, यह वास्तव में मॉडल एक परिमित Automaton जो अपने शब्दकोश की भाषा समझते हैं बजाय आँख बंद करके बचत सभी शब्दों
  • क्रम होना चाहिए के बाद से आपको कभी भी पी

'' पत्र मतलब आप कर सकते हैं: पेड़-संरचना में गहरे जाना

  • यह निश्चित रूप से मुझे क्या करना चाहते हैं क्या नहीं है, क्योंकि यह खाते में बोर्ड नहीं ले करता है (आप केवल 7 पत्र उपलब्ध है) उपलब्ध शाखाओं में से कोई भी ले लो। यदि आपके पास आवश्यक पत्र है तो आपको रिक्त स्थान का उपयोग करने की आवश्यकता नहीं है।

  • +0

    आपके पूर्ण उत्तर के लिए धन्यवाद। मेरी परियोजना की शुरुआत में, मैंने एक ट्री के बारे में सोचा, फिर भी मैं ऐसी जटिल डेटा संरचना को लागू करने से बचना चाहता था। मुझे ऑनलाइन रेडिक्स पेड़ का अच्छा कार्यान्वयन मिला, और इसे मेरे प्रशिक्षक से इसका उपयोग करने के लिए "सब-स्पष्ट" मिला। क्या आपको लगता है कि इसे काट लेंगे? –

    +0

    रेडिक्स पेड़ एक "अंतरिक्ष-कुशल" त्रिभुज है, सिद्धांत समान है इसलिए यह निश्चित रूप से काम करेगा। हालांकि आपके तर्क के साथ मुख्य मुद्दा: बस अपने कब्जे में अक्षरों के साथ शब्दों को बनाने की कोशिश अपर्याप्त है;) यदि आप अधिक सुराग चाहते हैं तो एसओ पर स्क्रैबल की तलाश करें। –

    1

    वहाँ कुछ अच्छा जवाब यहाँ पहले से ही कर रहे हैं, और मुझे लगता है कि एक Trie शायद जाने के लिए सही तरीका है, लेकिन यह एक दिलचस्प समस्या इसलिए मैं अपने दो सेंट के मूल्य में टॉस जाएगा ...

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

    सकारात्मक तरफ, शब्दकोश की जांच करना बाइनरी खोज या इसी तरह के कुछ के साथ हो सकता है। नकारात्मक पक्ष पर, आप यह कई बार ऐसा करेंगे कि कार्यक्रम पत्रों की लंबी सूची के लिए रोक देगा।

    हमें निश्चित रूप से इसे और अधिक उपयोगी बनाने के लिए शब्दकोश को प्रीप्रोसेस करने की आवश्यकता है, और हमें वास्तव में आवश्यक संभावित मैचों में से अधिकांश को रद्द करने का एक तरीका है, भले ही विधि कभी-कभी झूठी सकारात्मक स्थिति हो।

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

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

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

    संपादित

    मुझे कैसे आप प्रारंभिक खोज पर एक पूर्ण रैखिक खोज की तुलना में बेहतर कर सकता का एक उदाहरण बाहर टॉस करते हैं: मूलांक का उपयोग करें। एक साधारण इंडेक्स रखें जो आपको दिए गए अक्षर से शुरू होने वाले पहले शब्द को देखने देता है। फिर, खोज करते समय, उन सभी शब्दों को छोड़ दें जो आपके पास एक पत्र से शुरू होते हैं जो आपके पास नहीं है। यह एक विशाल गति नहीं है, लेकिन यह एक सुधार है।

    +0

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

    संबंधित मुद्दे