कैसे "कुछ परीक्षण मामलों की कोशिश करो" मूर्खतापूर्ण: एल्गोरिथ्म जो सही दिखाई देते हैं, लेकिन वास्तव में गलत हैं


105

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

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

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

विशेष रूप से, मैं देख रहा हूँ:

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

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

  3. एक एल्गोरिथ्म जो उच्च संभावना के साथ एक उचित मैनुअल टेस्ट रणनीति पास करेगा। कोई है जो हाथ से कुछ छोटे परीक्षण मामलों की कोशिश करता है, को दोष की खोज करने की संभावना नहीं होनी चाहिए। उदाहरण के लिए, "क्विकचेक को एक दर्जन छोटे परीक्षण मामलों पर हाथ से अनुकरण करें" यह प्रकट करने की संभावना नहीं होनी चाहिए कि एल्गोरिथ्म गलत है।

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

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


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

1
कुछ और खुदाई और मुझे उन दो ज्यामितीय एल्गोरिदम मिले।
ZeroUltimax

@ZeroUltimax आप सही हैं, किसी भी 3 गैर-कोलीनियर पीटी का केंद्र pt अंदर होने की गारंटी नहीं है। त्वरित उपाय है कि बाईं तरफ और सबसे दाहिनी तरफ के बीच की रेखा पर एक पीटी प्राप्त किया जाए। वहाँ समस्या और कहाँ है?
InformedA

इस प्रश्न का आधार मुझे एक तरह से अजीब लगता है, जिससे मुझे अपने सिर को पाने में कठिनाई हो रही है, लेकिन मुझे लगता है कि यह नीचे आता है एल्गोरिथ्म डिजाइन के लिए प्रक्रिया जैसा कि वर्णित है एक मौलिक रूप से टूटा हुआ है। यहां तक ​​कि उन छात्रों के लिए भी जो 'वहां नहीं रुकते' हैं। 1> एल्गोरिथ्म लिखें, 2> परीक्षण मामलों के बारे में सोचें, 3a> रोकें या 3b> सही साबित करें। पहला कदम काफी है समस्या डोमेन के लिए इनपुट वर्गों की पहचान हो। कॉर्नर मामलों और एल्गोरिथ्म स्वयं उन से उत्पन्न होते हैं। (cont)
मि। मिंडोर

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

जवाबों:


70

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

उदाहरण: सिक्का संप्रदाय, और एक संख्या , योग के रूप में व्यक्त : संभव के रूप में कुछ सिक्कों के साथ। n n d id1,,dknndi

एक भोली दृष्टिकोण सबसे बड़ा संभव सिक्का पहले उपयोग करने के लिए है, और लालच से इस तरह के योग का उत्पादन होता है।

उदाहरण के लिए, मूल्य , और वाले सिक्के और बीच संख्या को छोड़कर सभी संख्याओं के लालची के साथ सही उत्तर देंगे ।१ १ १४ १० = + + + + = + 65111410=6+1+1+1+1=5+5


10
यह वास्तव में एक अच्छा उदाहरण है, विशेष रूप से एक है कि छात्रों को नियमित रूप से गलत मिलता है। एल्गोरिथ्म को विफल देखने के लिए न केवल आपको विशेष सिक्का सेट लेने की आवश्यकता है, बल्कि विशेष मूल्यों की भी आवश्यकता है।
राफेल

2
इसके अलावा, मुझे यह कहने दें कि इस उदाहरण में छात्रों के पास अक्सर गलत प्रमाण भी होंगे (कुछ भोले-भाले तर्क देते हैं जो करीबी परीक्षा में असफल हो जाते हैं), इसलिए यहां एक से अधिक पाठ सीखे जा सकते हैं।
राफेल

2
पुरानी शैली की ब्रिटिश सिक्का प्रणाली (1971 के पूर्व दशमलव) में इसका वास्तविक उदाहरण था। चार शिलिंग को गिनने के लिए एक लालची एल्गोरिथ्म एक आधे मुकुट (2ill शिलिंग), एक शिलिंग सिक्का और एक छप्पन () शिलिंग) का उपयोग करेगा। लेकिन इष्टतम समाधान दो फ़्लोरिन (प्रत्येक शिलिंग प्रत्येक) का उपयोग करता है।
मार्क डोमिनस

1
वास्तव में कई मामलों में लालची एल्गोरिदम उचित लगते हैं, लेकिन काम नहीं करते हैं - एक और उदाहरण अधिकतम द्विदलीय मिलान है। दूसरी ओर, ऐसे उदाहरण भी हैं जहां ऐसा लगता है जैसे लालची एल्गोरिथ्म को काम नहीं करना चाहिए, लेकिन यह करता है: अधिकतम फैले हुए पेड़।
jkff

62

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

issame := (string1.length = string2.length);

if issame then
  for i := 1 to string1.length do
    issame := string1.char[i] = string2.char[i];

write(issame);

अब हम निम्नलिखित इनपुट के साथ कार्यक्रम का परीक्षण कर सकते हैं:

"विश्वविद्यालय" "विश्वविद्यालय" True; ठीक

"कोर्स" "कोर्स" True; ठीक

"" "" ट्रू; ठीक

"विश्वविद्यालय" "पाठ्यक्रम" झूठी; ठीक

"व्याख्यान" "पाठ्यक्रम" झूठी; ठीक

"परिशुद्धता" "सटीकता" झूठी, ठीक है

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

हालाँकि, परीक्षण काफी गहन था: हमने अलग-अलग लंबाई के साथ तार, समान लंबाई के साथ तार, लेकिन अलग-अलग सामग्री और यहां तक ​​कि समान तार भी थे। इसके अलावा, छात्र ने प्रत्येक शाखा का परीक्षण और निष्पादन भी किया था। आप वास्तव में तर्क नहीं दे सकते कि परीक्षण यहाँ लापरवाह था - यह देखते हुए कि यह कार्यक्रम वास्तव में बहुत सरल है, इसे पूरी तरह से परीक्षण करने के लिए प्रेरणा और ऊर्जा प्राप्त करना कठिन हो सकता है।


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

नीचे पंक्ति: यह आश्चर्यजनक रूप से कठिन हो सकता है कि कुछ द्विआधारी खोज एल्गोरिथ्म सिर्फ इसे परीक्षण करके सही है।


9
बेशक, स्रोत से दोष काफी स्पष्ट है (यदि आपने खुद से पहले एक समान बात लिखी है)।
राफेल

3
भले ही उदाहरण कार्यक्रम में साधारण दोष को ठीक किया जाता है, लेकिन तार काफी दिलचस्प समस्याएं देते हैं! स्ट्रिंग रिवर्सल एक क्लासिक है - इसे करने का "मूल" तरीका बस बाइट्स को उलट देना है। फिर एन्कोडिंग खेलने में आता है। फिर सरोगेट (आमतौर पर दो बार)। बेशक, समस्या यह है कि औपचारिक रूप से आपके तरीके को सही साबित करने का कोई आसान तरीका नहीं है।
16

6
हो सकता है कि मैं पूरी तरह से इस सवाल का गलत अर्थ लगा रहा हूं, लेकिन यह एल्गोरिथम में एक दोष के बजाय कार्यान्वयन में एक दोष लगता है।
मि। मिंडोर

8
@ Mr.Mindor: आप यह कैसे बता सकते हैं कि प्रोग्रामर ने एक सही एल्गोरिथ्म लिखा है या नहीं और फिर इसे गलत तरीके से लागू किया है, या एक गलत एल्गोरिथ्म लिखा है और फिर इसे ईमानदारी से लागू किया है (मैं "सही ढंग से" कहने में संकोच करता हूं!)
स्टीव जेसप

1
@wabbit यह बहस का मुद्दा है। आपके लिए जो स्पष्ट है वह प्रथम वर्ष के छात्र के लिए स्पष्ट नहीं हो सकता है।
जुहो

30

सबसे अच्छा उदाहरण जो मैंने कभी देखा, वह है परिक्षण परीक्षण:

इनपुट: प्राकृतिक संख्या पी, पी! = २
आउटपुट: पा प्राइम है या नहीं?
एल्गोरिथ्म: कंप्यूट 2 ** (पी -1) मॉड पी। यदि परिणाम = 1 है तो p अभाज्य है p नहीं है।

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

केवल 2 को शक्ति के आधार के रूप में उपयोग करने के बजाय, कोई भी अतिरिक्त का उपयोग करके एल्गोरिथ्म में सुधार कर सकता है, छोटे प्राइम को बढ़ाता है, जैसा कि पिछले प्रमुख ने लौटाया था। 1. और अभी भी, इस योजना के प्रतिपक्ष हैं, अर्थात् कार्मिकेल नंबर, हालांकि बहुत दुर्लभ है


फ़र्मैट प्राइमलिटी टेस्ट एक संभाव्य परीक्षण है, इसलिए आपकी पोस्ट-कंडीशन सही नहीं है।
फेमारेफ

5
.c यह एक संभाव्य परीक्षण है, लेकिन उत्तर अच्छी तरह से पता चलता है (अधिक सामान्यतः) कि कैसे संभाव्य एल्गोरिदम सटीक लोगों के लिए गलत है, त्रुटि का एक स्रोत हो सकता है।
कार्मिकेल

2
यह एक अच्छा उदाहरण है, एक सीमा के साथ: व्यावहारिकता परीक्षण के व्यावहारिक उपयोग के लिए, जो कि मैं असममित क्रिप्टोग्राफिक कुंजी पीढ़ी से परिचित हूं, हम संभाव्य एल्गोरिदम का उपयोग करते हैं! सटीक परीक्षणों के लिए संख्या बहुत बड़ी है (यदि वे नहीं थे, तो वे क्रिप्टो के लिए उपयुक्त नहीं होंगे क्योंकि चाबियाँ यथार्थवादी समय में क्रूर बल द्वारा पाई जा सकती हैं)।
गिल्स

1
जिस सीमा का आप उल्लेख करते हैं वह व्यावहारिक है, न कि सैद्धांतिक और क्रिप्टो प्रणालियों में प्रमुख परीक्षण जैसे कि आरएसए इन कारणों से दुर्लभ / अत्यधिक अनुचित असफलताओं के अधीन हैं , फिर से उदाहरण के महत्व को रेखांकित करते हैं। अर्थात व्यवहार में कभी-कभी यह सीमा अपरिहार्य के रूप में स्वीकार की जाती है। PKS के लिए P समय के एल्गोरिदम हैं जैसे AKS लेकिन वे अभ्यास में उपयोग होने वाली "छोटी" संख्याओं के लिए बहुत लंबा लेते हैं।
vzn

यदि आप न केवल 2 पी के साथ , बल्कि 50 अलग-अलग यादृच्छिक मूल्यों के लिए एक पी के साथ परीक्षण करते हैं 2 not ए पी, तो ज्यादातर लोग जानते होंगे कि यह संभाव्य है, लेकिन असफलताओं के साथ इतनी संभावना नहीं है कि यह अधिक संभावना है कि आपके कंप्यूटर में खराबी पैदा करता है गलत जवाब। 2 पी, 3 पी, 5 पी और 7 पी के साथ, विफलताएं पहले से ही बहुत दुर्लभ हैं।
gnasher729

21

यहाँ एक है जो मुझे एक सम्मेलन में गूगल प्रतिनिधि द्वारा फेंक दिया गया था। इसे C में कोडित किया गया था, लेकिन यह अन्य भाषाओं में काम करता है जो संदर्भ का उपयोग करते हैं। [Cs.se] पर कोड करने के लिए क्षमा करें, लेकिन यह केवल इसका उदाहरण है।

swap(int& X, int& Y){
    X := X ^ Y
    Y := X ^ Y
    X := X ^ Y
}

यह एल्गोरिथ्म x और y को दिए गए किसी भी मान के लिए काम करेगा, भले ही उनका मूल्य समान हो। हालाँकि यह काम नहीं करेगा यदि इसे स्वैप (x, x) के रूप में कहा जाता है। उस स्थिति में, x 0. के रूप में समाप्त होता है, यह आपको संतुष्ट नहीं कर सकता है, क्योंकि आप किसी तरह इस ऑपरेशन को गणितीय रूप से सही साबित कर सकते हैं, लेकिन फिर भी इस किनारे के मामले के बारे में भूल जाते हैं।


1
उस चाल का इस्तेमाल एक दोषपूर्ण RC4 कार्यान्वयन का निर्माण करने के लिए अंडरहेल्ड सी प्रतियोगिता में किया गया था । उस लेख को फिर से पढ़ते हुए, मैंने अभी देखा कि यह हैक शायद @DW द्वारा प्रस्तुत किया गया था
कोडइन्कॉउस

7
यह दोष वास्तव में सूक्ष्म है - लेकिन दोष भाषा-विशिष्ट है, हालांकि, यह वास्तव में एल्गोरिथ्म में दोष नहीं है; यह कार्यान्वयन में एक दोष है। व्यक्ति भाषा की विषमताओं के अन्य उदाहरणों के साथ आ सकता है जो सूक्ष्म दोषों को छिपाना आसान बनाते हैं, लेकिन वास्तव में वह नहीं था जिसकी मुझे तलाश थी (मैं एल्गोरिदम के अमूर्त स्तर पर कुछ खोज रहा था)। किसी भी मामले में, यह दोष एक आदर्श प्रदर्शन नहीं है जो प्रमाण का मूल्य है; जब तक आप पहले से ही एलियासिंग के बारे में नहीं सोच रहे हैं, तब तक आप उसी मुद्दे को खत्म कर सकते हैं जब आप सही होने का अपना "प्रमाण" लिखते हैं।
DW

यही कारण है कि मुझे आश्चर्य है कि यह इतना उच्च मतदान हुआ।
ज़ीरोउल्टिमैक्स

2
@DW यह बात है कि आप एल्गोरिथ्म को किस मॉडल में परिभाषित करते हैं। यदि आप किसी ऐसे स्तर पर जाते हैं, जहां मेमोरी संदर्भ स्पष्ट हैं (साझा करने की अनुपस्थिति मानने वाले सामान्य मॉडल के बजाय), यह एक एल्गोरिथ्म दोष है। दोष वास्तव में भाषा विशिष्ट नहीं है, यह किसी भी भाषा में बदल जाता है जो मेमोरी रेफरेन्सेस को साझा करने का समर्थन करता है।
गाइल्स

16

एल्गोरिदम का एक पूरा वर्ग है जो परीक्षण करने के लिए स्वाभाविक रूप से कठिन है: छद्म यादृच्छिक संख्या जनरेटर । आप किसी एक आउटपुट का परीक्षण नहीं कर सकते हैं, लेकिन आंकड़ों के साधनों के साथ आउटपुट की (कई) श्रृंखला की जांच करनी होगी। आप किस तरह और कैसे परीक्षण करते हैं इसके आधार पर आप गैर-यादृच्छिक विशेषताओं को याद कर सकते हैं।

एक प्रसिद्ध मामला जहां चीजें बुरी तरह से गलत हो गईं, वह है RANDU । इसने उस समय उपलब्ध जांच को पारित कर दिया - जो बाद के आउटपुट के tuples के व्यवहार पर विचार करने में विफल रहा । पहले से ही त्रिगुण बहुत सारी संरचना दिखाते हैं:

मूल रूप से, परीक्षणों में सभी उपयोग के मामले शामिल नहीं थे: जबकि RANDU का एकल-आयामी उपयोग (शायद ज्यादातर) ठीक था, इसने इसका उपयोग तीन-आयामी बिंदुओं (इस तरह से) के नमूने के लिए नहीं किया।

उचित छद्म यादृच्छिक नमूना एक मुश्किल व्यवसाय है। सौभाग्य से, वहाँ शक्तिशाली परीक्षण के दिन हैं, उदाहरण के लिए, मरने वाला जो कि एक प्रस्तावित जनरेटर में हमारे द्वारा ज्ञात सभी आंकड़ों को फेंकने में विशेषज्ञ है। यह प्रयाप्त है?

निष्पक्ष होने के लिए, मुझे नहीं पता कि आप PRNGs के लिए संभवत: क्या साबित कर सकते हैं।


2
अच्छा उदाहरण हालांकि वास्तव में सामान्य रूप से साबित करने का कोई तरीका नहीं है कि किसी भी PRNG का कोई दोष नहीं है, केवल कमजोर बनाम मजबूत परीक्षणों का एक अनंत पदानुक्रम है। वास्तव में किसी को भी किसी भी सख्त अर्थ में "यादृच्छिक" साबित करना संभवतया अविश्वसनीय है (हालांकि यह साबित होता है कि देखा गया है)।
vzn

1
यह एक अच्छी बात है कि परीक्षण करना कठिन है, लेकिन आरएनजी को साबित करना कठिन है। PRNG कीड़े को लागू करने के लिए इतने अधिक प्रवण नहीं हैं जितना कि बुरी तरह से निर्दिष्ट किया जा रहा है। डाईहार्ड जैसे टेस्ट कुछ उपयोगों के लिए अच्छे हैं, लेकिन क्रिप्टो के लिए, आप डेडहार्ड पास कर सकते हैं और फिर भी कमरे से बाहर हंसे जा सकते हैं। कोई "सिद्ध सुरक्षित" CSPRNG नहीं है, सबसे अच्छी उम्मीद आप यह साबित कर सकते हैं कि यदि आपका CSPRNG टूट गया है तो एईएस है।
गिलेस

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

1
क्रिप्टो यादृच्छिकता का अर्थ सांख्यिकीय यादृच्छिकता है। न तो गणितीय रूप से औपचारिक परिभाषा है, हालांकि, जहां तक ​​मुझे पता है, सूचना-सिद्धांत संबंधी यादृच्छिकता की धारणा (एक नियतात्मक ट्यूरिंग मशीन पर लागू PRNG की अवधारणा के साथ आदर्श और विरोधाभासी) के अलावा। क्या सांख्यिकीय यादृच्छिकता से परे एक औपचारिक परिभाषा है "उन वितरणों से स्वतंत्र होना चाहिए जिन्हें हम इसके खिलाफ परीक्षण करेंगे"?
गाइल्स

1
@vzn: संख्याओं का यादृच्छिक क्रम होने का क्या अर्थ है इसे कई संभावित तरीकों से परिभाषित किया जा सकता है, लेकिन एक सरल "बड़ी कोमोलगोरोव जटिलता" है। उस मामले में, यह दिखाना आसान है कि यादृच्छिकता का निर्धारण अनिर्दिष्ट है।
कोड़ी

9

2 डी स्थानीय अधिकतम

n×nA

(i,j)A[i,j]

A[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

फिर प्रत्येक बोल्ड सेल एक स्थानीय अधिकतम है। प्रत्येक गैर-खाली सरणी में कम से कम एक स्थानीय अधिकतम होता है।

O(n2)

AXXA(i,j)X(i,j)(i,j)

AXAX(i,j)A

AA

(i,j)AA(i,j)

एल्गोरिथ्म खुद को पर पुनरावर्ती कहता हैn2×n2A(i,j)

T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

इस प्रकार, हमने निम्नलिखित प्रमेय को सिद्ध किया है:

O(n)n×n

या हमारे पास है?


T(n)=O(nlogn)T(n)=T(n/2)+O(n)

2
यह एक सुंदर उदाहरण है! मुझे यह पसंद है। धन्यवाद। (मैं अंत में इस एल्गोरिथ्म में दोष का पता लगा लिया। टाइमस्टैम्प से आप यह जान सकते हैं कि मुझे कितनी देर तक एक कम बाउंड मिल सकता है। मैं वास्तविक समय प्रकट करने के लिए बहुत शर्मिंदा हूं। :-)
DW

1
O(n)

8

ये सामान्य उदाहरण हैं, क्योंकि ये आम हैं।

(१) सहानुभूति में भाव। अंक 1789 । एक प्रसिद्ध वेब साइट पर एक गलत परीक्षण किया गया था जो 10 ^ 14 के बाद तक विफल नहीं हुआ था। जबकि फिक्स सही था, यह केवल मामले को फिर से जोड़ने के बजाय छिद्रण छेद था।

(2) पर्ल 6 में परिमाण 6. पर्ल 6 ने प्राइम को जोड़ा है जो निश्चित ठिकानों के साथ कई एमआर परीक्षणों का उपयोग करता है। ज्ञात जाल हैं, लेकिन वे काफी बड़े हैं क्योंकि परीक्षणों की डिफ़ॉल्ट संख्या बहुत बड़ी है (मूल रूप से अपमानजनक प्रदर्शन द्वारा वास्तविक समस्या को छिपाते हुए)। जल्द ही इस पर ध्यान दिया जाएगा।

(३) FLINT में Primality। n_isprime () कंपोजिट के लिए सही लौट रहा है , तय होने के बाद से। मूल रूप से सिम्पी जैसा ही मुद्दा है। SPRP-2 pseudoprimes के Feitsma / Galway डेटाबेस का उपयोग करके 2 ^ 64 हम अब इनका परीक्षण कर सकते हैं।

(४) पर्ल का गणित :: परिमाण। is_aks_prime टूट । यह अनुक्रम बहुत सारे एकेएस कार्यान्वयन के समान लगता है - बहुत सारे कोड जो या तो दुर्घटना से काम करते हैं (उदाहरण के लिए चरण 1 में खो गए और परीक्षण प्रभाग द्वारा पूरी बात कर रहे हैं) या बड़े उदाहरणों के लिए काम नहीं किया। दुर्भाग्य से AKS इतना धीमा है कि इसका परीक्षण करना मुश्किल है।

(५) परी का पूर्व २.२ is_prime। गणित :: परी टिकट । इसने एमआर परीक्षणों के लिए 10 यादृच्छिक आधारों का उपयोग किया (स्टार्टअप पर निश्चित बीज के साथ, जीएमपी के निश्चित बीज हर कॉल के बजाय)। यह आपको बताएगा कि हर 1M कॉल में से 1 के बारे में 9 प्रमुख है। यदि आप सही संख्या उठाते हैं तो आप इसे अपेक्षाकृत बार-बार विफल कर सकते हैं, लेकिन संख्याएँ विरल हो जाती हैं, इसलिए यह व्यवहार में बहुत अधिक नहीं दिखाई देता है। उन्होंने तब से एल्गोरिथ्म और एपीआई को बदल दिया है।

यह गलत नहीं है, लेकिन यह संभावित परीक्षणों का एक क्लासिक है: आप कितने राउंड देते हैं, कहते हैं, mpz_probab_prime_p? यदि हम इसे 5 राउंड देते हैं, तो यह सुनिश्चित होता है कि यह अच्छी तरह से काम करता है - संख्याओं को बेस-210 फ़र्मेट टेस्ट पास करना होगा और फिर 5 पूर्व-चयनित बेस मिलर-राबिन परीक्षण। आपको 3892757297131 (GMP 5.0.1 या 6.0.0a के साथ) तक एक प्रतिरूप नहीं मिलेगा, इसलिए आपको इसे खोजने के लिए बहुत परीक्षण करना होगा। लेकिन वहाँ 2 ^ 64 के तहत हजारों counterexamples हैं। इसलिए आप नंबर बढ़ाते रहें। कितना दूर? क्या कोई प्रतिकूल है? एक सही उत्तर कितना महत्वपूर्ण है? क्या आप निश्चित ठिकानों के साथ यादृच्छिक ठिकानों को भ्रमित कर रहे हैं? क्या आप जानते हैं कि आपको कौन से इनपुट आकार दिए जाएंगे?

1016

ये सही ढंग से परीक्षण करने के लिए काफी कठिन हैं। मेरी रणनीति में स्पष्ट इकाई परीक्षण, प्लस एज मामले, पहले देखे गए या अन्य पैकेजों में विफलताओं के उदाहरण शामिल हैं, परीक्षण बनाम ज्ञात डेटाबेस जहां संभव हो (जैसे यदि आप एक एकल बेस -2 एमआर परीक्षण करते हैं, तो आपने कम्प्यूटेशनल रूप से कम कर दिया है परीक्षण के कार्य 2 ^ 64 संख्याओं के बारे में 32 मिलियन परीक्षण), और अंत में, मानक के रूप में एक और पैकेज का उपयोग करते हुए बहुत सारे यादृच्छिक परीक्षण। अंतिम बिंदु प्रायोगिक जैसे कार्यों के लिए काम करता है जहां एक काफी सरल इनपुट और एक ज्ञात आउटपुट है, लेकिन काफी कुछ कार्य इस तरह हैं। मैंने इसका उपयोग अपने स्वयं के विकास कोड के साथ-साथ तुलनात्मक पैकेजों में सामयिक समस्याओं के दोषों को खोजने के लिए किया है। लेकिन अनंत इनपुट स्पेस को देखते हुए, हम हर चीज का परीक्षण नहीं कर सकते।

शुद्धता साबित करने के लिए, यहाँ एक और मौलिकता उदाहरण है। BLS75 विधियों और ECPP में एक प्रमाणिकता प्रमाणपत्र की अवधारणा है। मूल रूप से वे अपने प्रमाणों के लिए काम करने वाले मूल्यों को खोजने के लिए खोज करते हुए मंथन करते हैं, वे उन्हें एक ज्ञात प्रारूप में आउटपुट कर सकते हैं। फिर एक सत्यापनकर्ता लिख ​​सकता है या किसी और ने इसे लिखा है। ये निर्माण की तुलना में बहुत तेजी से चलते हैं, और अब या तो (1) कोड के दोनों टुकड़े गलत हैं (इसलिए आप सत्यापनकर्ताओं के लिए अन्य प्रोग्रामर क्यों पसंद करेंगे), या (2) प्रमाण विचार के पीछे का गणित गलत है। # 2 हमेशा संभव है, लेकिन ये आम तौर पर कई लोगों द्वारा प्रकाशित और समीक्षा की गई हैं (और कुछ मामलों में आपके लिए खुद को चलना आसान है)।

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

सॉफ़्टवेयर को केवल कुछ खिलौनों के उदाहरणों से अधिक पर परीक्षण करना महत्वपूर्ण है, और एल्गोरिथ्म के प्रत्येक चरण पर कुछ उदाहरणों से गुजरना और "यह इनपुट दिया गया है, क्या यह समझ में आता है कि मैं इस राज्य के साथ यहां हूं?"


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

आप पहले बिंदु पर सही हैं - सही एल्गोरिथ्म + बग बिंदु नहीं है, हालांकि चर्चा और अन्य उदाहरण उन्हें भी स्वीकार कर रहे हैं। फ़ील्ड उन अनुमानों के साथ पका हुआ है जो छोटी संख्या के लिए काम करते हैं लेकिन गलत हैं। बिंदु (2) के लिए जो कुछ के लिए सच है, लेकिन मेरे उदाहरण # 1 और # 3 इस मामले में नहीं थे - यह माना जाता था कि एल्गोरिथ्म सही था (ये 5 आधार 10 ^ 16 के तहत संख्या के लिए सिद्ध परिणाम देते हैं), फिर बाद में पता चला कि यह नहीं था।
दनाज

क्या यह छद्म मौलिकता परीक्षण के साथ एक मौलिक मुद्दा नहीं है?
asmeurer

asmeurer, हाँ मेरे # 2 में और बाद में उनमें से चर्चा। लेकिन # 1 और # 3 दोनों मिलर-राबिन का उपयोग करने के मामले थे, एक ज्ञात सीमा के नीचे निर्धारक सही परिणाम देने के लिए ज्ञात ठिकानों के साथ। तो इस मामले में "एल्गोरिथ्म" (ओपी से मिलान करने के लिए शिथिल शब्द का उपयोग करना) गलत था। # 4 एक संभावित प्राइम टेस्ट नहीं है, लेकिन जैसा कि डीडब्ल्यू ने बताया, एल्गोरिथ्म ठीक काम करता है, यह सिर्फ कार्यान्वयन है जो मुश्किल है। मैंने इसे शामिल किया क्योंकि यह एक समान स्थिति की ओर जाता है: परीक्षण की आवश्यकता है, और आपके द्वारा काम करने से पहले आप इसे सरल उदाहरणों से कितना आगे बढ़ा सकते हैं?
दनाज

आपकी पोस्ट में से कुछ सवाल फिट बैठते हैं जबकि कुछ नहीं (cf @ DW की टिप्पणी)। कृपया उन उदाहरणों (और अन्य सामग्री) को हटा दें जो प्रश्न का उत्तर नहीं देते हैं।
राफेल

7

फिशर-येट्स-नुथ शफलिंग एल्गोरिदम एक (व्यावहारिक) उदाहरण है और जिस पर इस साइट के लेखकों में से एक ने टिप्पणी की है

एल्गोरिथ्म एक दिए गए सरणी के यादृच्छिक क्रमांकन को उत्पन्न करता है:

 // To shuffle an array a of n elements (indices 0..n-1):
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]

ij0ji

एक "भोली" एल्गोरिथ्म हो सकता है:

 // To shuffle an array a of n elements (indices 0..n-1):
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ n-1
       exchange a[j] and a[i]

जहां लूप में स्वैप किए जाने वाले तत्व को सभी उपलब्ध तत्वों में से चुना जाता है। हालांकि यह क्रमपरिवर्तन (कुछ अधिक प्रतिनिधित्व आदि) के पक्षपाती नमूने का उत्पादन करता है ।

वास्तव में एक फिशर-येट्स-नथ-शफलिंग के साथ एक सरल (या भोले) गिनती विश्लेषण का उपयोग करके आ सकता है ।

nn!=n×n1×n2..nn1

यह सत्यापित करने में मुख्य समस्या है कि फेरबदल एल्गोरिथ्म सही है या नहीं ( पक्षपाती है या नहीं ) यह है कि आंकड़ों के कारण बड़ी संख्या में नमूनों की आवश्यकता है। Codinghorror लेख मैंने ऊपर लिंक बताते हैं वास्तव में (और वास्तविक परीक्षण के साथ)।


1
एक फेरबदल एल्गोरिथ्म के लिए एक उदाहरण शुद्धता प्रमाण के लिए यहां देखें ।
राफेल

5

सबसे अच्छा उदाहरण (पढ़ें: बात मैं सबसे बट चोट के बारे में है) मैंने कभी देखा है कि कोलेजन अनुमान के साथ क्या करना है। मैं एक प्रोग्रामिंग प्रतियोगिता में था (पहले स्थान के लिए लाइन पर 500 डॉलर के पुरस्कार के साथ) जिसमें समस्याओं में से एक न्यूनतम संख्या को खोजने के लिए दो संख्याओं को एक ही संख्या तक पहुंचने के लिए लेना था। पाठ्यक्रम का हल बारी-बारी से हर एक को तब तक करना है जब तक कि वे दोनों उस चीज तक नहीं पहुंच जाते जो पहले देखी जा चुकी है। हमें संख्याओं की एक सीमा दी गई थी (मुझे लगता है कि यह 1 और 1000000 के बीच था) और बताया कि कोलेज़ अनुमान को 2 ^ 64 तक सत्यापित किया गया था, इसलिए हम सभी को दिए गए संख्याओं को अंततः 1 में परिवर्तित कर दिया गया। मैंने 32-बिट का उपयोग किया पूर्णांकों को हालांकि इसके साथ ही करना है। यह पता चला है कि 1 और 1000000 (170 हजार कुछ) के बीच एक अस्पष्ट संख्या है, जो नियत समय में 32-बिट पूर्णांक को ओवरफ्लो करने का कारण बनेगी। वास्तव में ये संख्याएँ अत्यंत दुर्लभ हैं 2 ^ 31। हमने बड़ी संख्या में 1000000 से अधिक के लिए अपने सिस्टम का परीक्षण किया ताकि यह सुनिश्चित हो सके कि ओवरफ्लो नहीं हो रहा है। एक बहुत छोटी संख्या है कि हम सिर्फ अतिप्रवाह के कारण परीक्षण नहीं किया है। बिकुसे I ने "लॉन्ग" के बजाय "int" का उपयोग किया मुझे केवल $ 500 के पुरस्कार के बजाय 300 डॉलर का पुरस्कार मिला।


5

नैकपैक 0/1 समस्या एक है जो लगभग सभी छात्रों को लगता है कि एक लालची एल्गोरिथ्म द्वारा हल किया जा सकता है। ऐसा अधिक बार होता है जब आप पहले कुछ लालची समाधानों को नैकपैक के समस्या संस्करण के रूप में दिखाते हैं जहां एक लालची एल्गोरिथ्म काम करता है

उन समस्याओं के लिए, कक्षा में , मुझे किसी भी संदेह को दूर करने के लिए और लालची समस्या संस्करण के लिए भी नैकपैक 0/1 ( डायनेमिक प्रोग्रामिंग ) के लिए प्रमाण दिखाना चाहिए । वास्तव में, दोनों प्रमाण तुच्छ नहीं हैं और छात्र शायद उन्हें बहुत मददगार पाते हैं। इसके अलावा, CLRS 3ed , अध्याय 16, पृष्ठ 425-427 में इस बारे में एक टिप्पणी है ।

समस्या: चोर एक दुकान को लूटता है और डब्ल्यू के अधिकतम वजन को अपने नॉकपैक में ले जा सकता है। वहाँ n आइटम और ith आइटम wi हैं और vi डॉलर के लायक हैं। चोर को क्या सामान लेना चाहिए? अपने लाभ को अधिकतम करने के लिए ?

निप्प्सैक 0/1 समस्या : सेटअप समान है, लेकिन आइटम छोटे टुकड़ों में नहीं तोड़े जा सकते हैं , इसलिए चोर या तो आइटम लेने का फैसला कर सकता है या इसे छोड़ सकता है (द्विआधारी विकल्प), लेकिन हो सकता है कि वह किसी वस्तु का कुछ अंश न ले। ।

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

  • बैग की कुल क्षमता ले लो, और जितना संभव हो उतना सबसे अधिक मूल्य वाली वस्तु डालें, और इस विधि को तब तक पुनरावृत्त करें जब तक आप अधिक ऑब्जेक्ट नहीं डाल सकते क्योंकि बैग भरा हुआ है या बैग के अंदर डालने के लिए कम ओ बराबर वजन वाली वस्तु नहीं है।
  • अन्य गलत तरीका सोच रहा है: लाइटर आइटम डालें और इन निम्नलिखित को सबसे कम कीमत पर रखें।
  • ...

क्या यह आपके लिए मददगार है? वास्तव में, हम जानते हैं कि सिक्का समस्या एक समस्या है। लेकिन, नैकपैक की समस्याओं के जंगल में अधिक उदाहरण हैं, उदाहरण के लिए, नॅप्सैक 2 डी के बारे में क्या है (यह वास्तविक सहायक है जब आप फर्नीचर बनाने के लिए लकड़ी काटना चाहते हैं , मैंने अपने शहर के एक स्थानीय में देखा था), यह बहुत आम है। लालची यहाँ भी काम करता है, लेकिन नहीं।


लालची पहले से ही स्वीकृत जवाब में कवर किया गया था , लेकिन विशेष रूप से नॅप्सैक समस्या कुछ जाल सेट करने के लिए अच्छी तरह से अनुकूल है।
राफेल

3

एक सामान्य गलती गलत एल्गोरिदम को गलत तरीके से लागू करना है। विकिपीडिया पर चर्चा देखें ।

n!nn(n1)n


1
यह एक अच्छा बग है, लेकिन परीक्षण के मामलों को मूर्ख बनाने का एक अच्छा उदाहरण नहीं है, क्योंकि परीक्षण वास्तव में एक फेरबदल एल्गोरिदम पर लागू नहीं होता है (यह यादृच्छिक है, इसलिए आप इसे कैसे परीक्षण करेंगे? एक परीक्षण मामले को विफल करने का क्या मतलब होगा, और? आप कैसे पता लगा है कि उत्पादन में देखने से)?
DW

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

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

1
@PerAlexandersson: भले ही आप केवल एक ही फेरबदल उत्पन्न करते हों, यह n> 2080 के साथ MT का उपयोग करके वास्तव में यादृच्छिक नहीं हो सकता है। अब उम्मीद से विचलन बहुत छोटा हो जाएगा, इसलिए आप शायद परवाह नहीं करेंगे ... लेकिन यह लागू होता है भले ही आप अवधि से बहुत कम उत्पन्न करते हैं (जैसा कि asmeurer ऊपर बताया गया है)।
चार्ल्स

2
ऐसा लगता है कि निकोस एम द्वारा अधिक विस्तृत एक द्वारा अप्रचलित कर दिया गया है ?
राफेल

2

पायथन PEP450 जो मानक पुस्तकालय में सांख्यिकी कार्यों को प्रस्तुत करता है वह ब्याज का हो सकता है। एक समारोह के लिए औचित्य के हिस्से के रूप में जो अजगर के मानक पुस्तकालय में विचरण की गणना करता है, लेखक स्टीवन डी'अपरान लिखते हैं:

def variance(data):
        # Use the Computational Formula for Variance.
        n = len(data)
        ss = sum(x**2 for x in data) - (sum(data)**2)/n
        return ss/(n-1)

ऊपर एक आकस्मिक परीक्षण के साथ सही प्रतीत होता है:

>>> data = [1, 2, 4, 5, 8]
>>> variance(data)
  7.5

लेकिन हर डेटा बिंदु पर एक स्थिरांक जोड़ने से विचरण को नहीं बदलना चाहिए:

>>> data = [x+1e12 for x in data]
>>> variance(data)
  0.0

और विचरण कभी भी नकारात्मक नहीं होना चाहिए :

>>> variance(data*100)
  -1239429440.1282566

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


1
n1

2
@ राफेल: हालांकि निष्पक्ष होने के लिए, चुना हुआ एल्गोरिथ्म फ़्लोटिंग-पॉइंट डेटा के लिए एक खराब विकल्प के रूप में जाना जाता है।

2
यह केवल संख्या विज्ञान के बारे में ऑपरेशन के कार्यान्वयन के बारे में नहीं है और कैसे सटीक खो दिया है। यदि आप अधिकतम सटीकता चाहते हैं तो आपको एक निश्चित तरीके से अपने संचालन का आदेश देना होगा। यह उस मुद्दे पर था जब विश्वविद्यालय में मेरा संख्यात्मक पाठ्यक्रम था।
क्रिश्चियन

राफेल की सटीक टिप्पणी के अलावा, इस उदाहरण की कमी यह है कि मुझे नहीं लगता कि शुद्धता का प्रमाण इस दोष से बचने में मदद करेगा। यदि आपको फ्लोटिंग-पॉइंट अंकगणित की सूक्ष्मताओं के बारे में पता नहीं है, तो आप सोच सकते हैं कि आपने इसे सही साबित कर दिया है (यह साबित करके कि फॉर्मूला मान्य है)। इसलिए यह छात्रों को सिखाने के लिए एक आदर्श उदाहरण नहीं है कि उनके एल्गोरिदम को सही साबित करना क्यों महत्वपूर्ण है। यदि छात्रों ने इस उदाहरण को देखा, तो मेरा संदेह यह है कि वे इसके बजाय "फ्लोटिंग पॉइंट / न्यूमेरिक कंप्युटेशन स्टफ ट्रिकी" पाठ को आकर्षित करेंगे।
DW

1

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

nn2+n+410<dd divides n2+n+41d<n2+n+41

प्रस्तावित समाधान :

int f(int n) {
   return 1;
}

n=0,1,2,,39n=40

यह "कुछ छोटे मामलों की कोशिश करता है और परिणाम से एक एल्गोरिथ्म का अनुमान लगाता है" अक्सर प्रोग्रामिंग प्रतियोगिताओं में फसलों को अप्रोच करता है (हालांकि यहां उतना नहीं) जहां दबाव एक एल्गोरिथ्म के साथ आने वाला है जो (ए) को लागू करने के लिए त्वरित है और (बी) ) का तेजी से चलने का समय है।


5
मुझे नहीं लगता कि यह एक बहुत अच्छा उदाहरण है, क्योंकि कुछ लोग 1. लौटकर एक बहुपद के विभाजक को खोजने का प्रयास करेंगे
ब्रायन एस

1
nn3n

यह प्रासंगिक हो सकता है, इस अर्थ में कि भाजक (या अन्य कैक्ल्यूलेशन) के लिए एक निरंतर मान लौटाता है, एक समस्या के लिए एक गलत एल्गोरिथम दृष्टिकोण का परिणाम हो सकता है (उदाहरण के लिए एक सांख्यिकीय समस्या, या एल्गोरिथ्म के किनारे मामलों को संभालना नहीं)। हालाँकि उत्तर को पुनःप्रकाश करने की आवश्यकता है
निकोस एम।

@NikosM। हे। मुझे ऐसा लगता है कि मैं यहाँ एक मरे हुए घोड़े को पीट रहा हूँ, लेकिन सवाल का दूसरा पैराग्राफ कहता है कि "यदि उनका एल्गोरिथ्म मुट्ठी भर उदाहरणों पर सही ढंग से काम करता है, जिसमें कोने के सभी मामले शामिल हैं जिन्हें वे आजमाने के लिए सोच सकते हैं, तो वे निष्कर्ष निकालते हैं कि एल्गोरिथ्म को अवश्य पूरा करना चाहिए। सही रहें। हमेशा एक छात्र पूछता है: "मुझे अपने एल्गोरिथ्म को सही साबित करने की आवश्यकता क्यों है, अगर मैं इसे केवल कुछ परीक्षण मामलों पर आज़मा सकता हूं?" इस उदाहरण में, पहले 40 मानों के लिए (एक छात्र की तुलना में कहीं अधिक है) प्रयास करने की संभावना है), 1 लौटाना सही है। मुझे लगता है कि यह वही है जो ओपी देख रहा था।
रिक डेकर

ठीक है, हाँ, लेकिन यह वाक्यांश के रूप में तुच्छ है (शायद ठेठ सही), लेकिन सवाल की भावना में नहीं। अभी भी रीफ़्रेशिंग की आवश्यकता होगी
निकोस एम।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.