สมมติว่าเราต้องการพัฒนาโครงสร้างข้อมูลที่สามารถสร้างขึ้นด้วยเวลาหมดอายุ และสนับสนุนฟังก์ชันที่ใช้ ID ผู้ใช้และการประทับเวลา การดำเนินการนี้จะตรวจสอบว่าผู้ใช้ที่มี user_id ที่ระบุ ณ เวลาที่กำหนด คำขอล้มเหลวหรือไม่ จะล้มเหลวก็ต่อเมื่อผู้ใช้มีคำขอที่ประสบความสำเร็จน้อยกว่าเวลาหมดอายุที่กำหนดที่ผ่านมา
ดังนั้นหากอินพุตเหมือนหมดอายุ =6 ให้สร้างวัตถุ obj และเรียกใช้ฟังก์ชัน obj.limit(0,10), obj.limit(0,16), obj.limit(0,17) และ obj.limit( 1,20) จากนั้นผลลัพธ์จะเป็น False, False, True และ False ตามลำดับเพราะสำหรับผู้ใช้ 0 ในตอนแรกไม่มีคำขอดังนั้นจึงเป็นเท็จ ดังนั้น ณ เวลา 16 จะไม่มากกว่าเวลาหมดอายุ 6 กว่าคำขอล่าสุด 10 แต่เมื่ออายุ 17 ปี จะเป็นจริง และสำหรับคำขอสุดท้าย จะเป็นสำหรับผู้ใช้ 1 ดังนั้นคำขอเริ่มต้นจึงเป็นเท็จ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
กำหนดคอนสตรัคเตอร์ การดำเนินการนี้จะหมดอายุ
- lastCall :=สร้างพจนานุกรมโดยค่าเริ่มต้นคือ -1
- กำหนดฟังก์ชัน limit() การดำเนินการนี้จะใช้เวลา uid การประทับเวลา
- last :=lastCall[uid]
- ถ้าสุดท้ายเหมือนกับ -1 หรือ (สุดท้าย + หมดอายุ) <=เวลาประทับ แล้ว
- lastCall[uid] :=เวลาประทับ
- คืนค่าเท็จ
- คืนค่า 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