Xây dựng một cấu trúc dữ liệu được khởi tạo với thời gian hết hạn expire, hỗ trợ phương thức limit(uid, timestamp) kiểm tra xem yêu cầu của người dùng uid tại thời điểm timestamp có bị từ chối hay không. Yêu cầu bị từ chối (True) chỉ khi người dùng đã có một yêu cầu thành công cách đây ít hơn expire đơn vị thời gian.
Ví dụ: expire = 6, lần lượt gọi limit(0,10), limit(0,16), limit(0,17), limit(1,20) → kết quả: False, False, True, False.
Thuật toán
- Sử dụng
defaultdict(lambda: -1)lưu thời gian yêu cầu thành công gần nhất của mỗiuid(mặc định -1 nghĩa là chưa có yêu cầu). - Phương thức
limit(uid, timestamp):- Lấy
last = lastCall[uid]. - Nếu
last == -1hoặclast + expire <= timestamp: cập nhậtlastCall[uid] = timestampvà trả vềFalse(cho phép). - Ngược lại: trả về
True(từ chối).
- Lấy
Mã Python
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)) # False
print(obj.limit(0, 16)) # False
print(obj.limit(0, 17)) # True
print(obj.limit(1, 20)) # False
Đầu vào / Đầu ra
Input: RateLimit(6) + các lệnh gọi limit
Output: False False True False