Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

पायथन में कम से कम बार-बार उपयोग किए जाने वाले कैश को लागू करने का कार्यक्रम

मान लीजिए कि हम कम से कम बार-बार उपयोग किए जाने वाले (एलएफयू) कैश सिस्टम के लिए डेटा संरचना लागू करना चाहते हैं। इसे निम्नलिखित कार्यों का समर्थन करना चाहिए:

  • get(key) - यदि कुंजी कैश में मौजूद है, तो यह कुंजी का मान प्राप्त करने में मदद करता है, अन्यथा -1 लौटाता है।

  • सेट (कुंजी, मान) - यदि कुंजी पहले से मौजूद नहीं है तो इसका उपयोग मान को सेट या सम्मिलित करने के लिए किया जाएगा।

जब कैश अपनी अधिकतम क्षमता तक पहुँच जाता है, तो उसे एक नया तत्व सम्मिलित करने से पहले कम से कम उपयोग किए जाने वाले तत्व को अमान्य कर देना चाहिए।

इसलिए, यदि LFUCache को क्षमता 2 के साथ प्रारंभ किया गया है और इन विधियों को कॉल करें cache.set(1, 1); कैशे.सेट(2, 2); कैश.गेट (1); कैशे.सेट(3, 3); कैश.गेट(2); कैशे.सेट(4, 4); कैश.गेट (1); कैश। प्राप्त करें (3); कैश। प्राप्त करें (4); तो आउटपुट क्रमशः 1,−1,1,−1,4 होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • प्रारंभकर्ता क्षमता मान लेगा

  • शेष :=क्षमता

  • कम से कम_फ्रीक:=1

  • node_for_freq :=इन्सर्ट ऑर्डर के अनुसार डेटा को होल्ड करने के लिए मैप

  • node_for_key :=एक नया नक्शा

  • फ़ंक्शन को परिभाषित करें _update() । यह कुंजी, मान लेगा

  • एक्स, आवृत्ति:=नोड_फॉर_की [कुंजी]

  • कुंजी के अनुरूप node_for_freq[freq] से तत्व हटाएं

  • अगर node_for_freq[least_freq] का आकार 0 के समान है, तो

    • कम से कम_फ़्रेक :=कम से कम_फ़्रेक + 1

  • node_for_freq[freq+1, key] :=value, freq+1

  • node_for_key[key] :=value, freq+1

  • एक फ़ंक्शन को परिभाषित करें get() । यह कुंजी लेगा

  • यदि नोड_फॉर_की में नहीं है तो कुंजी गैर-शून्य है, तो

    • वापसी -1

  • मान :=node_for_key[कुंजी, 0]

  • _अपडेट (कुंजी, मान)

  • वापसी मूल्य

  • फ़ंक्शन सेट() को परिभाषित करें। यह कुंजी, मान लेगा

  • यदि नोड_फॉर_की में कुंजी गैर-शून्य है, तो

    • _अपडेट (कुंजी, मान)

  • अन्यथा,

    • node_for_key[कुंजी] :=मान,1

    • node_for_freq[1, key] :=value,1

    • यदि शेष 0 के समान है, तो

      • हटाया गया :=fifoorder में node_for_freq[least_freq] से एक तत्व हटाएं

      • नोड_फॉर_की से हटाए गए तत्व को हटाई गई कुंजी से मेल खाती है[0]

    • अन्यथा,

      • बने रहें :=बने रहें - 1

  • कम से कम_फ्रीक:=1

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

from collections import defaultdict, OrderedDict
class LFUCache:
   def __init__(self, capacity):
      self.remain = capacity
      self.least_freq = 1
      self.node_for_freq = defaultdict(OrderedDict)
      self.node_for_key = dict()
   def _update(self, key, value):
      _, freq = self.node_for_key[key]
      self.node_for_freq[freq].pop(key)
      if len(self.node_for_freq[self.least_freq]) == 0:
         self.least_freq += 1
      self.node_for_freq[freq+1][key] = (value, freq+1)
      self.node_for_key[key] = (value, freq+1)
   def get(self, key):
      if key not in self.node_for_key:
         return −1
      value = self.node_for_key[key][0]
      self._update(key, value)
      return value
   def set(self, key, value):
      if key in self.node_for_key:
         self._update(key, value)
      else:
         self.node_for_key[key] = (value,1)
         self.node_for_freq[1][key] = (value,1)
         if self.remain == 0:
            removed =
self.node_for_freq[self.least_freq].popitem(last=False)
            self.node_for_key.pop(removed[0])
         else:
            self.remain −= 1
         self.least_freq = 1
cache = LFUCache(2)
cache.set(1, 1)
cache.set(2, 2)
print(cache.get(1))
cache.set(3, 3)
print(cache.get(2))
cache.set(4, 4)
print(cache.get(1))
print(cache.get(3))
print(cache.get(4))

इनपुट

cache.set(1, 1)
cache.set(2, 2)
cache.get(1)
cache.set(3, 3)
cache.get(2)
cache.set(4, 4)
cache.get(1)
cache.get(3)
cache.get(4)

आउटपुट

1
−1
1
−1
4

  1. पायथन में strStr () लागू करें

    मान लीजिए कि हमारे पास दो तार हैं str और sub_str। हमें str में sub_str की पहली घटना का पता लगाना है। तो अगर स्ट्रिंग str helloworld है, और सबस्ट्रिंग lo है, तो परिणाम 3 होगा। यह सी में स्ट्रस्ट्र () फ़ंक्शन का उपयोग करके किया जा सकता है। हमें सी में स्ट्रस्ट्र () के समान एक और फ़ंक्शन डिज़ाइन करना

  1. कॉल करने योग्य () पायथन प्रोग्राम में

    इस ट्यूटोरियल में, हम बिल्ट-इन मेथड callable() पर चर्चा करने जा रहे हैं। . यह एक तर्क लेता है और लौटाता है कि क्या तर्क कॉल करने योग्य . है या नहीं। यदि आप कोई फंक्शन या क्लास लेते हैं, तो वे कॉल करने योग्य होते हैं। पूर्णांक, फ्लोट्स, स्ट्रिंग्स इत्यादि जैसे स्थिरांक कॉल करने योग्य नहीं हैं। उदाहरण

  1. रॉक पेपर कैंची गेम को लागू करने के लिए पायथन कार्यक्रम

    पायथन का उपयोग करके हम बहुत ही रोचक गेम भी विकसित कर सकते हैं। रॉक पेपर कैंची गेम उनमें से एक है। यहाँ हम रैंडिंट () फ़ंक्शन का उपयोग यादृच्छिक संख्याएँ उत्पन्न करने के लिए करते हैं। इस खेल में खिलाड़ी आमतौर पर तीन की अनुमति देते हैं, या खेल का नाम बोलते हैं, हर बार या तो मुट्ठी में एक हाथ उठाते है