ट्रैक
/
Python
Python
/
अभ्यास
/
वृत्ताकार बफर
वृत्ताकार बफर

वृत्ताकार बफर

आसान

निर्देश

सर्कुलर बफर, साइक्लिक बफर या रिंग बफर एक ऐसा डेटा स्ट्रक्चर है जो एक ही निश्चित आकार के बफर का उपयोग इस तरह करता है मानो उसका अंतिम सिरा पहले सिरे से जुड़ा हो।

सर्कुलर बफर शुरू में खाली होता है और उसकी लंबाई पहले से तय होती है। उदाहरण के लिए, यह 7 एलिमेंट वाला बफर है:

[ ][ ][ ][ ][ ][ ][ ]

मान लीजिए कि बफर के बीच में एक 1 लिखा जाता है (सर्कुलर बफर में शुरुआत की ठीक जगह से कोई अंतर नहीं पड़ता):

[ ][ ][ ][1][ ][ ][ ]

अब मान लीजिए कि दो और एलिमेंट, 2 और 3, जोड़े जाते हैं, जो 1 के बाद जुड़ जाते हैं:

[ ][ ][ ][1][2][3][ ]

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

[ ][ ][ ][ ][ ][3][ ]

जब बफर में 7 एलिमेंट हो जाते हैं, तो वह पूरी तरह भर जाता है:

[5][6][7][8][9][3][4]

जब बफर भर जाता है, तो एक एरर मिलती है, जो क्लाइंट को बताती है कि जब तक कोई स्लॉट खाली न हो जाए, तब तक और कुछ लिखा नहीं जा सकता।

जब बफर भर जाता है, तो क्लाइंट चाहे तो जबरन लिखकर सबसे पुराना डेटा ओवरराइट कर सकता है। इस स्थिति में दो और एलिमेंट, A और B, जोड़े जाते हैं और वे 3 और 4 को ओवरराइट कर देते हैं:

[5][6][7][8][9][A][B]

3 और 4 की जगह A और B आ गए हैं, जिससे अब बफर में 5 सबसे पुराना डेटा है। अंत में, अगर दो एलिमेंट हटाए जाएँ, तो 5 और 6 लौटाए जाएँगे, और बफर ऐसा हो जाएगा:

[ ][ ][7][8][9][A][B]

चूँकि जगह खाली है, अगर क्लाइंट फिर से ओवरराइट करके C और D संग्रहीत करता है, तो 7 और 8 की जगह नहीं, बल्कि वही जगह इस्तेमाल होगी जहाँ पहले 5 और 6 रखे गए थे। 7 अब भी सबसे पुराना एलिमेंट है और बफर एक बार फिर भर जाता है।

[C][D][7][8][9][A][B]

एक्सेप्शन को अपनी ज़रूरत के अनुसार बनाना और raise करना

कभी-कभी आपके कोड में एक्सेप्शन को अपनी ज़रूरत के अनुसार बनाना और raise करना, दोनों ज़रूरी हो जाता है। ऐसा करते समय आपको हमेशा एक अर्थपूर्ण एरर मैसेज शामिल करना चाहिए, जो बताए कि एरर का स्रोत क्या है। इससे आपका कोड पढ़ने में आसान होता है और डीबग करने में काफी मदद मिलती है।

कस्टम एक्सेप्शन नई एक्सेप्शन क्लास बनाकर बनाए जा सकते हैं, जो आम तौर पर Exception की सबक्लास होती हैं। इनके बारे में ज़्यादा जानने के लिए classes देखिए।

ऐसी स्थितियों में, जहाँ आपको पता है कि एरर का स्रोत किसी खास एक्सेप्शन टाइप से ही निकलेगा, आप Exception क्लास के अंतर्गत आने वाले built in error types में से किसी एक को इनहेरिट कर सकते हैं। एरर raise करते समय भी आपको एक अर्थपूर्ण संदेश शामिल करना चाहिए।

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

किसी built-in exception को अपनी ज़रूरत के अनुसार बनाने के लिए, ऐसी class बनाइए जो उस एक्सेप्शन से इनहेरिट करती हो। जब आप कस्टम एक्सेप्शन को किसी संदेश के साथ raise करें, तो उस संदेश को exception टाइप के आर्गुमेंट के रूप में लिखिए:

# subclassing the built-in BufferError to create BufferFullException
class BufferFullException(BufferError):
    """Exception raised when CircularBuffer is full.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

        
# raising a BufferFullException
raise BufferFullException("Circular buffer is full")

स्रोत

Wikipediaयह लिंक एक नई विंडो या टैब में खुलता है
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Python Exercism

वृत्ताकार बफर शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।

वृत्ताकार बफर को गहराई से जानिए!

इस वीडियो में हम वृत्ताकार बफर पर नज़र डालते हैं: यह क्या है, कहाँ इस्तेमाल होता है, और इसके अलग-अलग कार्यान्वयन कौन-कौन से हैं। इनमें क्यू, स्टैटिक और डायनामिक ऐरे, इम्यूटेबल डेटा स्ट्रक्चर और एजेंट आधारित एक मज़ेदार कार्यान्वयन शामिल हैं।