मान लीजिए हम एक डेटा स्ट्रक्चर विकसित करना चाहते हैं जिसे एक्सपायर टाइम के साथ बनाया जा सके, और जो एक फ़ंक्शन को सपोर्ट करता है जो यूजर आईडी और टाइमस्टैम्प लेता है। यह जांचेगा कि दिए गए यूजर आईडी और टाइमस्टैम्प पर यूजर का रिक्वेस्ट फेल होता है या नहीं। यह तभी फेल होगा जब यूजर ने दिए गए एक्सपायर टाइम से कम समय पहले सफल रिक्वेस्ट की हो।
उदाहरण के लिए, यदि इनपुट है expire = 6, फिर ऑब्जेक्ट obj बनाएं, और फ़ंक्शन कॉल करें obj.limit(0,10), obj.limit(0,16), obj.limit(0,17) और obj.limit(1,20), तो आउटपुट क्रमशः False, False, True और False होगा क्योंकि यूजर 0 के लिए, शुरुआत में कोई रिक्वेस्ट नहीं थी तो False, फिर टाइम 16 पर यह अंतिम रिक्वेस्ट 10 से एक्सपायर टाइम 6 से अधिक नहीं है, लेकिन 17 पर यह True है और अंतिम रिक्वेस्ट के लिए, यह यूजर 1 के लिए है तो शुरुआती रिक्वेस्ट False है।
समाधान दृष्टिकोण
- कंस्ट्रक्टर परिभाषित करें जो expire लेता है:
- lastCall := एक डिक्शनरी बनाएं जिसका डिफ़ॉल्ट मान -1 हो
- limit() फ़ंक्शन परिभाषित करें जो uid, timestamp लेता है:
- last := lastCall[uid]
- यदि last -1 के बराबर है या (last + expire) <= timestamp, तो:
- lastCall[uid] := timestamp
- False लौटाएं
- True लौटाएं
उदाहरण कोड
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