কম্পিউটার টিউটোরিয়াল

পাইথনে LFU Cache (Least Frequently Used Cache) ইমপ্লিমেন্টেশন

লিস্ট ফ্রিকোয়েন্টলি ইউজড (LFU) ক্যাশ সিস্টেমের জন্য একটি ডেটা স্ট্রাকচার ডিজাইন ও ইমপ্লিমেন্ট করতে হবে। এটি নিচের অপারেশনগুলো সাপোর্ট করবে:

  • get(key) — কি যদি ক্যাশে থাকে তবে এর মান রিটার্ন করবে, নাইলে -1 রিটার্ন করবে।

  • put(key, value) — কি যদি ক্যাশে না থাকে তবে সেটি ইনসার্ট করবে।

যখন ক্যাশের সর্বোচ্চ ক্যাপাসিটিতে পৌঁছাবে, তখন কম ব্যবহৃত উপাদানটি (least frequently used) বাদ দিয়ে নতুন উপাদান ইনসার্ট করা হবে।

যেমন, LFUCache ক্যাপাসিটি ২ দিয়ে ইনিশিয়ালাইজ করলে এবং নিচের মেথডকলগুলো দিলে: cache.put(1, 1); cache.put(2, 2); cache.get(1); cache.put(3, 3); cache.get(2); cache.put(4, 4); cache.get(1); cache.get(3); cache.get(4); আউটপুট হবে 1, -1, 1, -1, 4।

সমাধানের ধাপসমূহ
  • ইনিশিয়ালাইজার ক্যাপাসিটি ভ্যালু নেবে।

  • remain := capacity

  • least_freq := 1

  • node_for_freq := ইনসার্ট অর্ডার অনুযায়ী ডেটা রাখার জন্য ম্যাপ

  • node_for_key := নতুন ম্যাপ

  • _update() ফাংশন ডিফাইন করবে (key, value প্যারামিটার लेकर)।

  • get() এবং put() ফাংশন ডিফাইন করবে।

উদাহরণ (সম্পূর্ণ ইমপ্লিমেন্টেশন)
import collections

class LFUCache:
    def __init__(self, capacity):
        self.remain = capacity
        self.least_freq = 1
        self.node_for_freq = collections.defaultdict(collections.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 put(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

# Testing
cache = LFUCache(2)
cache.put(1, 1)
cache.put(2, 2)
print(cache.get(1))  # 1
cache.put(3, 3)
print(cache.get(2))  # -1
cache.put(4, 4)
print(cache.get(1))  # -1
print(cache.get(3))  # 1
print(cache.get(4))  # 4
ইনপুট
cache.put(1, 1)
cache.put(2, 2)
cache.get(1)
cache.put(3, 3)
cache.get(2)
cache.put(4, 4)
cache.get(1)
cache.get(3)
cache.get(4)
আউটপুট
1
-1
1
-1
4
  1. পাইথনে issuperset() ফাংশন

  2. পাইথনে Quine প্রোগ্রাম (স্ব-প্রजनনকারী কোড)

  3. পাইথন অবজেক্ট ক্যাশে সংরক্ষণের আগে কীভাবে কমপ্রেস করবেন?

  4. পাইথনে রেগুলার এক্সপ্রেশন ক্যাশ কীভাবে ক্লিয়ার করবেন?