สมมติว่าเราต้องการพัฒนาโครงสร้างข้อมูลที่สร้างขึ้นพร้อมกับเวลาหมดอายุ (expire time) และรองรับฟังก์ชันที่รับรหัสผู้ใช้ (user_id) และ timestamp ฟังก์ชันนี้จะตรวจสอบว่าคำร้องขอของผู้ใช้ในเวลาที่กำหนดล้มเหลวหรือไม่ จะล้มเหลวก็ต่อเมื่อผู้ใช้เคยมีคำร้องขอที่สำเร็จภายในเวลาหมดอายุที่กำหนด
เช่น ถ้าอินพุตคือ 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 ยังไม่เกิน expire time 6 จากคำร้องขอครั้งล่าสุดที่ 10 แต่ที่ 17 จึงเป็น True และคำร้องขอสุดท้ายเป็นของผู้ใช้ 1 จึงเป็น False
ขั้นตอนการแก้ปัญหา
- กำหนด Constructor รับ
expire - สร้าง
lastCallเป็น Dictionary ที่ค่าเริ่มต้นคือ -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