ধরুন আমরা একটি ডেটা স্ট্রাকচার ডেভেলপ করতে চাই যা মেয়াদ শেষ হওয়ার সাথে সাথে তৈরি করতে পারে এবং এমন একটি ফাংশনকে সমর্থন করে যা ব্যবহারকারীর আইডি এবং একটি টাইমস্ট্যাম্প নেয়। প্রদত্ত টাইমস্ট্যাম্পে প্রদত্ত user_id সহ ব্যবহারকারী অনুরোধ ব্যর্থ হয়েছে কিনা তা পরীক্ষা করবে। এটি তখনই ব্যর্থ হবে যখন ব্যবহারকারীর প্রদত্ত মেয়াদ শেষ হওয়া সময়ের চেয়ে কম একটি সফল অনুরোধ ছিল৷
সুতরাং, যদি ইনপুটটি expire =6 এর মত হয় তবে একটি অবজেক্ট অবজেক্ট তৈরি করুন এবং obj.limit(0,10), obj.limit(0,16), obj.limit(0,17) এবং obj.limit( 1,20), তারপর আউটপুট যথাক্রমে False, False, True এবং False হবে কারণ ব্যবহারকারী 0 এর জন্য, প্রাথমিকভাবে কোন অনুরোধ ছিল না তাই এটি মিথ্যা, তারপর 16 এ এটি শেষ অনুরোধ 10 এর চেয়ে মেয়াদ শেষ হওয়ার সময় 6 এর বেশি নয়, কিন্তু 17 এ এটি সত্য এবং শেষ অনুরোধের জন্য, এটি ব্যবহারকারী 1 এর জন্য তাই প্রাথমিক অনুরোধ মিথ্যা৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
কনস্ট্রাক্টর সংজ্ঞায়িত করুন। এর মেয়াদ শেষ হয়ে যাবে
- lastCall :=একটি অভিধান তৈরি করুন যার ডিফল্ট মান হল -1
- একটি ফাংশন সীমা () সংজ্ঞায়িত করুন। এটি uid, টাইমস্ট্যাম্প লাগবে
- last :=lastCall[uid]
- যদি শেষটি -1 বা (শেষ + মেয়াদ শেষ) <=টাইমস্ট্যাম্পের মতো হয়, তাহলে
- lastCall[uid] :=টাইমস্ট্যাম্প
- মিথ্যে ফেরত দিন
- সত্য ফেরান
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
from collections import defaultdict class RateLimit: def __init__(self, expire): self.expire = expire self.lastCall = defaultdict(lambda: -1) def limit(self, uid, timestamp): last = self.lastCall[uid] if last == -1 or last + self.expire <= timestamp: self.lastCall[uid] = timestamp return False return True expire = 6 obj = RateLimit(expire) print(obj.limit(0,10)) print(obj.limit(0,16)) print(obj.limit(0,17)) print(obj.limit(1,20))
ইনপুট
RateLimit(6) obj.limit(0,10) obj.limit(0,16) obj.limit(0,17) obj.limit(1,20)
আউটপুট
False False True False