【发布时间】:2021-11-18 15:41:41
【问题描述】:
我在在线评估中遇到了这个问题,但无法找到最佳解决方案。我在这篇文章的底部写了我尝试过的东西。以下是问题的摘要:
缓存系统使用优先级来决定哪些内存项从主内存移动到缓存。您将获得一个格式为 的输入数组。
案例 1 输入数组:callLogs = [[1,1], [2,1], [2,1], [4,2], [5,2], [6,2]]
项目从优先级 0 开始,最低优先级为 0。每次访问一个项目,优先级增加 2(如果在同一秒内访问两次,优先级增加 4)。在没有访问项目的情况下每经过一秒,其优先级就会降低 1。如果项目的优先级 > 5,则将其添加到缓存中。如果优先级低于
最后返回缓存中的项目
对于情况 1,应该返回 2,因为第 2 项最后的优先级为 6,第 1 项最后的优先级为 2。
| time | item 1 access | priority | item 2 access | priority |
|---|---|---|---|---|
| 0 | 0 | 0 | ||
| 1 | 1 | 2 | 0 | |
| 2 | 2 | 6 | 0 | |
| 3 | 5 | 0 | ||
| 4 | 4 | 1 | 2 | |
| 5 | 3 | 1 | 4 | |
| 6 | 2 | 1 | 6 |
我尝试了什么:我创建了一个哈希图,其中键作为项目 ID,值作为时间列表,并且每次循环,检查是否每次都访问了每个项目。但我正在寻找更有效的解决方案,并假设它应该使用优先级队列。我使用 Python 进行在线评估,但由于这是一个优先队列问题,Java 可能更适合它?
【问题讨论】:
-
他们可能指的是 LRU 缓存 en.wikipedia.org/wiki/…
-
副手,我认为您可以根据(大致)时间+优先级计算“分数”,并将其用作排序地图中的比较值。然后您轮询以从当前时间 + 3 中逐出所有内容。结果将是您的 O(lg n) 解决方案,但需要更多思考才能查看“分数”是否如我所愿。
标签: python java caching priority-queue