LFU (Least Frequently Used) ক্যাশে একটি ডেটা স্ট্রাকচার যা সবচেয়ে কম ব্যবহৃত আইটেমটি মুছে ফেলে যখন ক্যাশে ফুল হয়ে যায়। এটি নিচের অপারেশনগুলো সমর্থন করে:
get(key)— কী থাকলে ভ্যালু রিটার্ন করে, নাইলে-1।set(key, value)— কী-ভ্যালু জোড়া ইনসার্ট বা আপডেট করে।
উদাহরণ: ক্ষমতা ২-র LFUCache-এ set(1,1); set(2,2); get(1); set(3,3); get(2); set(4,4); get(1); get(3); get(4) কল করলে আউটপুট হবে 1, -1, 1, -1, 4।
সমাধানের ধাপসমূহ
ইনিশিয়ালাইজারে
capacityনিন।remain := capacity,least_freq := 1।node_for_freq:= ফ্রিকোয়েন্সি অনুযায়ী অর্ডার্ড ডিকশনারি (OrderedDict)।node_for_key:= সাধারণ ডিকশনারি।_update(key, value)ফাংশন:পুরানো ফ্রিকোয়েন্সি থেকে কী মুছুন।
যদি
least_freqবাকেট খালি হয়, তবেleast_freq++।নতুন ফ্রিকোয়েন্সি
freq+1-এ কী যোগ করুন।
get(key):কী নাইলে
-1রিটার্ন।ভ্যালু পাওয়া গেলে
_update()কল করুন এবং ভ্যালু রিটার্ন করুন।
set(key, value):কী থাকলে
_update()।নতুন কী হলে ফ্রিকোয়েন্সি ১-এ যোগ করুন।
যদি
remain == 0হয়, তবেleast_freqবাকেট থেকে সবচেয়ে পুরানো (FIFO) কী মুছুন।অন্যথায়
remain--।least_freq = 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