一个 Web 服务器可以接收数百万个用户的登录请求。一个用户可以多次登录。根据时间复杂度设计最佳算法/数据结构,以返回给定时间间隔之间的唯一用户总数。
例如:计算间隔 t1 & t2 和 t2 & t3 之间的唯一用户总数。还要考虑返回重叠间隔的总数(t1 = 10am,t2 = 10:15am,t3 = 10:30am,返回 10:10am 到 10:20am 之间的用户总数)
以下是我的建议,希望人们发表评论吗?
Hashmap 和最小堆的 IMO 组合将是一个最佳解决方案。
Hashmap-将键作为用户ID,将值作为指向最小堆中相应节点的节点指针。最小堆 - 最后登录时间作为键和值作为用户 ID。Root 将是登录时间最早的用户。同样在根存储最小堆中节点总数的计数,以便我们可以快速返回计数。
当用户登录时。以 user-id 作为键在 hashmap 中查找。a) 如果不匹配,则将新用户插入 hashmap 并将用户的新节点插入最小堆,并增加存储在最小堆根节点的计数。b) 否则它是一个老用户更新它的最后登录值并且不增加最小堆根节点中的计数。
每当我们想找出在 t2-t1 之间登录的唯一用户时,a. 从堆中提取 min(root) 并检查当前时间 - 最后登录时间 > t2-t1 分钟。如果大于从 hashmap 和 min_heap 中删除该值。湾。重复上述步骤(a),直到堆的min元素满足当前时间-last-logged-in time <= t2-t1 mins c。从最小堆的根节点返回计数值。
但我无法确定重叠间隔的算法。