परिशोधित विश्लेषण? (सबसे खराब स्थिति प्रदर्शन गारंटी)


13

परिशोधित विश्लेषण क्या है? और यह मुझे अपने कार्यक्रमों में सबसे खराब प्रदर्शन की गारंटी देने में कैसे मदद कर सकता है ?

मैं पढ़ रहा था कि निम्नलिखित तकनीकों से प्रोग्रामर को वर्स्ट-केस प्रदर्शन की गारंटी प्राप्त करने में मदद मिल सकती है (यानी मेरे अपने शब्दों में: गारंटी है कि किसी प्रोग्राम का रनिंग टाइम सबसे खराब कास्ट में चलने के समय से अधिक नहीं होगा):

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

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

जवाबों:


14

आप परिशोधन विश्लेषण लागू नहीं करते हैं। यह अधिक सटीक Oसीमा प्राप्त करने की तकनीक है ।

आपको जो आवश्यक अवलोकन करना है, वह यह है कि महंगा ऑपरेशन किसी भी समय नहीं हो सकता है।

एक सरणी-समर्थित डेटा संरचना के मामले में, सरणी को हर अब और फिर आकार बदलने की आवश्यकता होती है - जब यह पूर्ण हो। यह सबसे महंगा ऑपरेशन है और इसमें O(n)समय लगता है। सरणी में अन्य सभी आवेषण हैं O(1)

nआइटम सम्मिलित करने के लिए रनटाइम निर्धारित करने के लिए , आप nसबसे महंगे ऑपरेशन के साथ गुणा कर सकते हैं O(n), जिसके परिणामस्वरूप समग्र रनटाइम व्यवहार होता है O(n^2)

हालाँकि, यह गलत है क्योंकि आकार परिवर्तन बहुत बार नहीं हो सकता है।

जब पैसे के बारे में बात करते हैं, तो आप लागत को बढ़ाते हैं , जब आप समय के साथ कई छोटे भुगतानों के साथ अपने ऋण का भुगतान करते हैं।

हम इस मॉडल का उपयोग एल्गोरिदम के बारे में भी सोच सकते हैं। हम केवल मानसिक मानचित्रण से बचने के लिए "धन" के साथ "समय" का विकल्प देते हैं।

एक बार जब यह लंबाई पूरी हो जाती है n, तो हम इसका आकार दोगुना कर सकते हैं। हमें निम्नलिखित ऑपरेशन करने की आवश्यकता है:

  • 2nस्मृति का चौतरफा आवंटन
  • nआइटम कॉपी करें

अगर हम यह मान लें कि मेमोरी को आवंटित करना और कॉपी करना रैखिक समय में होता है, तो यह बहुत महंगा ऑपरेशन होने वाला है। हालाँकि, अब हम ऋण के विचार का उपयोग कर सकते हैं और अपने विश्लेषण के लिए इसे संशोधित कर सकते हैं। केवल, हम वास्तव में इसे बनाने से पहले अपने ऋण में संशोधन करने जा रहे हैं।
मान लेते हैं, कि हमारा बैलेंस (पैसे / समय का) 0 पर वापस आ गया है (यानी हमारे पास कोई ऋण नहीं है और न ही हमारे पास कोई बचे हुए हैं) एक बार जब हमने सरणी को बदल दिया है।

यह निम्नलिखित निहितार्थ है:

  • अगले nआइटम सम्मिलित करने से आकार बदलने और कॉपी करने की लागत को कवर किया जाएगा (हमने nस्लॉट का उपयोग किया है, और nअप्रयुक्त स्लॉट `)

अब हम इस बारे में सोच सकते हैं कि हर डालने के ऑपरेशन को कितना भुगतान करना होगा:

  • सम्मिलित करते हैं
  • स्मृति का एक हिस्सा आवंटित करने की लागत
  • इसे नई आवंटित मेमोरी में स्थानांतरित करने की लागत

हमने अब स्मृति को आवंटित करने, कॉपी करने और अगले nतत्वों को सम्मिलित करने के लिए लागत को कवर किया है । हालांकि, हमने अभी तक पुराने nतत्वों के लिए जगह आवंटित करने के साथ-साथ उनकी नकल करने की उपेक्षा की है।

हम अपने पुराने nतत्वों की लागतों को अपने नए (अभी तक डाले जाने वाले) nतत्वों में वितरित करते हैं:

  • स्मृति का एक हिस्सा आवंटित करने की लागत
  • इसे नई आवंटित मेमोरी में स्थानांतरित करने की लागत

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

प्रत्येक इंसर्ट-ऑपरेशन में अभी भी लगातार समय लगता है, लेकिन रिसाइज़िंग मुफ्त में होती है: हमने प्रत्येक इंसर्शन पर "अधिक" समय खर्च करके इसे परिमित किया।

नतीजतन, nतत्वों को सम्मिलित करने में O(n)समय लगता है।

परिशोधन विश्लेषण के लिए अन्य तकनीकों को यहां समझाया गया है


1

सबसे पहले: यह प्रोग्राम रनटाइम के विश्लेषण के लिए एक तकनीक है, एल्गोरिदम के लिए कार्यान्वयन तकनीक नहीं है।

आपकी सूची में उल्लिखित उदाहरण एक अच्छा है: एकल आइटम को सरणी-समर्थित डेटा-संरचना में लागू करना। प्रत्येक एकल परिशिष्ट ऑपरेशन के लिए सबसे खराब स्थिति सभी मौजूदा वस्तुओं को कॉपी करने की है। इस तरह का विश्लेषण बहुत अधिक निराशावादी है, जैसा कि आपको ऐसा करने की ज़रूरत नहीं है, यदि आप एक आकार बदलने की रणनीति का उपयोग कर रहे हैं (आकार को कुछ x> 1.0 से गुणा करना)। विश्लेषण तब कहता है कि आपके पास एक O (n ^ 2) बाध्य है - O (n) प्रति आइटम बार n आइटम - जबकि वास्तविक रनटाइम केवल O (n) है।

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

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