【问题标题】:Priority Queue Caching Problem (Java/Python)优先队列缓存问题(Java/Python)
【发布时间】: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


【解决方案1】:

有人向我解释了答案。创建哈希映射是一个很好的第一步,但没有必要在循环中单独执行每个时间步骤。如果一个项目在时间 [6, 7, 20, 50] 被访问,我们知道它最后不会在缓存中,因为在时间 50 它的优先级将为 2。

我们可以用这个公式计算当前的优先级

if oldTime == newTime:
  currentPriority += 2
else:
  currentPriority = max(oldPriority - (newTime - oldTime - 1), 0) + 2

循环遍历每个项目并执行此操作,并在模拟结束时间检查优先级,而不仅仅是每个项目的最后一个时间步

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多