2023春-B-5 LRU-K 缓存
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
LRU 全称为 Least Recently Used,即“最近最少使用”。LRU 缓存机制是指,当缓存满了,而缓存区外面的一个新数据被调用的时候,将缓存中最近最少使用(即最长时间没有被使用过)的数据清除,为新数据开辟出空间。
LRU-K 是 LRU 算法的变种,K 代表最近使用的次数,LRU 可以认为是 LRU-1。不同于 LRU 算法的是,LRU-K 算法需要维护两套队列(历史访问队列,缓存队列)。当历史访问队列中的数据被命中 K 次后,数据才会移动至缓存队列中。
例如:假设所有队列长度为 5,初始内存中没有数据。使用 LRU-2 算法,数据访问顺序为:9,5,6,7,8,3,8,9,5,9,8,3,4,7,5,6。则历史访问队列和缓存队列的变化如下表所示:
| 访问元素 | 历史访问队列 | 缓存队列 |
|---|---|---|
| 9,5,6,7,8 | 空 | |
| 3 | 5,6,7,8,3 | |
| 8 | 5,6,7,3 | 8 |
| 9 | 5,6,7,3,9 | |
| 5 | 6,7,3,9 | 8,5 |
| 9 | 6,7,3 | 8,5,9 |
| 8 | 5,9,8 | |
| 3 | 6,7 | 5,9,8,3 |
| 4 | 6,7,4 | |
| 7 | 6,4 | 5,9,8,3,7 |
| 5 | 9,8,3,7,5 | |
| 6 | 4 | 8,3,7,5,6 |
你的任务就是实现这种 LRU-K 缓存机制。
输入格式
输入第一行给出 3 个正整数:()、 () 和 (),分别为规定的缓存命中次数、队列的大小(假设历史访问队列和缓存队列的大小一致)和被调用的数据的数量。随后一行给出 个被调用的数据的编号。编号为区间 内的一个整数。一行中的数字以空格分隔。
输出格式
在第一行中输出历史访问队列中数据的编号。第二行输出缓存队列中数据的编号。顺序为队头至队尾。数据间以 1 个空格分隔,行首尾不得有多余空格。如果队列为空则输出 - 表示空行。
样例
2 5 17
9 5 6 7 8 3 8 9 5 9 8 3 4 7 5 6 9
4 9
8 3 7 5 6
3 5 10
9 5 6 7 8 3 8 9 5 9
7 3 8 5 9
-
限制
Java (javac) 时间限制 900 ms 内存限制 256 MB
其他编译器 时间限制 200 ms 内存限制 64 MB