程序检查在给定条件下将在python中处理的请求数

假设我们有一个请求列表,其中每个列表包含类似[uid,time_sec]的元素(uid是用户ID,time_sec是时间戳)。这表示其id为uid的用户已在时间戳记time_sec上请求网站。我们还有两个值u和g,其中u表示给定uid在任何<60秒帧中允许的最大请求数,而g是全局在任何<60秒帧中允许的最大请求数。现在,如果我们要一个接一个地处理每个请求并对其进行速率限制。并且,如果有多个用户同时存在请求,则将首先处理具有较低uid的请求,否则将删除该请求。我们必须找到将成功处理的请求总数。

因此,如果输入像是请求= [[0,1],[1,2],[1,3]] u = 1 g = 5,则输出将为2,因为用户0和1可以在时间1和2,但是来自用户1的第二个请求将不会被处理,因为一个用户最多可以在60秒的帧中发送1请求。

为了解决这个问题,我们将遵循以下步骤-

  • 最后:=一个空的映射

  • 总计:=空双头队列

  • 窗口时间:= 60

  • 根据时间对请求进行排序,如果相同,则根据uid进行排序

  • 数量:= 0

  • 对于请求中的每个r,

    • 在last [uid]末尾插入时间

    • 在总计末尾插入时间

    • 数量:=数量+ 1

    • 从last [uid]删除左项

    • 删除总计的左项

    • [uid,time]:= r

    • 而total的大小> 0且total [0] + windowtime <=时间,则

    • 而last [uid]的大小> 0和last [uid,0] + windowtime <=时间,

    • 如果total的大小<g并且last [uid] <u的大小,则

    • 返回金额

    让我们看下面的实现以更好地理解-

    例 

    from collections import defaultdict, deque
    class Solution:
       def solve(self, requests, u, g):
          last = defaultdict(deque)
          total = deque()      windowtime = 60
          requests.sort(key=lambda x: [x[1], x[0]])
    
          amount = 0
          for r in requests:
             uid, time = r
    
             while len(total) > 0 and total[0] + windowtime <= time:
                total.popleft()
    
             while len(last[uid]) > 0 and last[uid][0] + windowtime <= time:
                last[uid].popleft()
    
             if len(total) < g and len(last[uid]) < u:
                last[uid].append(time)
                total.append(time)
                amount += 1
          return amount
         
    ob = Solution()requests = [[0, 1],[1, 2],[1,3]]
    u = 1
    g = 5
    print(ob.solve(requests, u, g))

    输入值

    [[0, 1],[1, 2],[1,3]], 1, 5

    输出结果

    2
    猜你喜欢