algorithm - क्या ब्रूट बल के लिए कोई प्राथमिकता एक बुरा संकेत है?




brute-force (10)

केन थॉम्पसन: "जब संदेह होता है, ब्रूट बल का उपयोग करें"

मैं एक शुरुआत सी + + प्रोग्रामर हूँ, और मेरे दिमाग को फैलाने के लिए मैं projecteuler.net पर कुछ समस्याओं का प्रयास कर रहा हूं। स्कूल में गणित में दिलचस्पी होने के बावजूद, मैंने अपने आप को स्वचालित रूप से समस्याओं के समाधान के लिए जबरदस्त बल समाधानों के चलते पाया है, कुछ सुव्यवस्थित या सुरुचिपूर्ण दिखने के बजाय

क्या यह ध्वनि एक बुरी मानसिकता की तरह है? मुझे थोड़ा दोषी लगता है ऐसा करना, लेकिन शायद जल्दी और गंदे कुछ समय ठीक है ...


क्या आप समस्याओं के लिए 1 मिनट के रनटाइम नियम के अंदर फिट हैं? यदि हां, तो आपका "क्रूर बल" समाधान सभी आवश्यकताओं को पूरा करता है, और वास्तव में यह एक बहुत अच्छा संकेत है कि आप तुरंत काम करने वाली किसी चीज के साथ आ सकते हैं!

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


मुझे लगता है आपको देखना चाहिए कि आपका अंतिम लक्ष्य क्या है और आपकी बाधाएं क्या हैं

कभी-कभी एक ब्रूटफोर्स विधि समाधान के हर संयोजन की कोशिश में 50ms में एक समस्या को हल कर सकती है और एक "चालाक" समाधान इसे 10ms में हल कर सकता है उस समय, समाधान समझने में कम चालाक लेकिन आसान चालाक समाधान को उखाड़ता है।

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

तो अपने आप से पूछिए, आप ये परियोजना यूलर समस्याओं का प्रयास क्यों कर रहे हैं? क्या आप इसे सीखना चाहते हैं? इसके बाद शायद एक चतुर समाधान की कोशिश करना आपके सर्वोत्तम हित में होगी, लेकिन शुरूआत के बाद ही समस्या का आकलन करने में मदद करने के लिए एक क्रूर बल समाधान की कोशिश की।

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


मैं इस विकास के माध्यम से चले गए हैं:

  1. इसे संकलित करने के लिए प्राप्त करें
  2. यह अपेक्षित रूप में काम करें
  3. काम करता है एक समाधान है कि बाहर चित्रा
  4. एक अच्छे समाधान को समझें
  5. कई समाधानों को समझें, और सबसे अच्छा ढूंढें
  6. कई समाधानों को समझें, और इस स्थिति के लिए सर्वोत्तम खोजिए
  7. ?? वहाँ अभी तक नहीं मिल गया है

यदि ऐसा होता है तो ऐसी स्थिति होती है जहां "जानवर बल" => "सरल" और "सुरुचिपूर्ण" => "जटिल", फिर जबरदस्त बल जीत जाता है। और यह बहुत अक्सर सच है।


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

मैं अक्सर उसी नाव में जाता हूं जो आप कर रहे हैं और यही वजह है कि मैंने पीई समस्याओं को शुरू करना शुरू कर दिया था - मैं बहुत सारे बल बल के तरीकों को लागू कर रहा था और खुद को और अधिक सुरुचिपूर्ण समाधानों में प्रकट करना चाहता था ...


सुरुचिपूर्ण समाधान अनायास नहीं बनाए गए थे; वे क्रूर बल समाधान से प्राप्त किए गए थे जब वर्तमान समाधान से अधिक गति या कम स्मृति खपत की आवश्यकता थी।

तो नहीं, ऐसा नहीं है। यह कैसे सुरुचिपूर्ण समाधान अस्तित्व में आया।


शुरुआती प्रोग्रामर के रूप में, आप अपनी मानसिक ऊर्जा को अधिक खर्च कर रहे होंगे, जिसमें पता चल जाएगा कि प्रत्येक समस्या के लिए एक चतुर समाधान खोजने पर ऊर्जा खर्च करने के बजाय, सी ++ में वास्तव में चीजें कैसे लागू करें। यह ठीक है, क्योंकि यह आपको विभिन्न प्रकार की समस्याओं पर कार्य करते समय सी ++ के विभिन्न क्षेत्रों का पता लगाने का अवसर देता है।

जब आप सी ++ में प्रवीण हो जाते हैं और आपको हर चीज के बारे में सोचने की ज़रूरत नहीं होती है, तो आप गैर-ब्रूट-बल समाधानों की खोज के लिए और अधिक समय बिताने में सक्षम होंगे।


आपने अपना विकल्प तौला है। यदि ब्रूट बल समाधान को नौकरी मिल जाएगी और ठीक प्रदर्शन करेंगे, तो यह एक अच्छा समाधान है।


इसे एक अलग संदर्भ में डालने के लिए:

जब आप किसी ऐसी लाइब्रेरी का उपयोग करते हैं जिसे आप बहुत अच्छी तरह से नहीं जानते (उदाहरण के लिए यूआई बनाने के लिए), आप एक साधारण समस्या को पूरी तरह कार्यात्मक तरीके से हल कर सकते हैं, यद्यपि आप जानते हैं कि ऐसा करने के लिए "सही तरीका" है। यदि आप जिज्ञासु और चिंतित हैं कि आपके जानवर-बल कोड आपको मूर्ख बना देता है, तो आप जल्द ही इसे करने के लिए "सही रास्ता" मिल जाएगा (जैसे, सप्ताहांत पर, या जब आप सोते हैं)। इस बीच, क्रूर शक्ति के माध्यम से, आपके पास कुछ ऐसा होगा जो काम करता है

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

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





brute-force