【2025刷题笔记】- 内存冷热标记

刷题笔记合集🔗

内存冷热标记

问题描述

现代计算机系统中通常存在多级的存储设备,针对海量 workload 的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。

一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,则认为是热内存页,否则是冷内存页。

对于统计窗口内跟踪到的访存序列和阈值,现在需要实现基于频次的冷热标记。内存页使用页框号作为标识。

输入格式

第一行输入为 ,表示访存序列的记录条数,

第二行为访存序列,空格分隔的 个内存页框号,页面号范围 ,同一个页框号可能重复出现,出现的次数即为对应框号的频次。

第三行为热内存的频次阈值 ,正整数范围

输出格式

第一行输出标记为热内存的内存页个数,如果没有被标记的热内存页,则输出

如果第一行 ,则接下来按照访问频次降序输出内存页框号,一行一个,频次一样的页框号,页框号小的排前面。

样例输入

10
1 2 1 2 1 2 1 2 1 2
5
5
1 2 3 4 5
3

样例输出

2
1
2
0
样例 解释说明
样例1 内存页1和内存页2均被访问了5次,达到了阈值5,因此热内存页有2个。内存页1和内存页2的访问频次相等,页框号小的排前面。
样例2 访存跟踪里面访存频次没有超过3的,因此热内存个数为0。

数据范围

  • ,其中 为访存序列的记录条数
  • 页面号范围
  • ,其中 为热内存的频次阈值

题解

这道题目考察的是哈希表的使用以及多条件排序。整体思路非常直观:统计每个内存页框号出现的次数,然后按照要求进行排序和输出。

具体步骤如下:

  1. 读取输入:访存序列长度N、访存序列和频次阈值T
  2. 使用哈希表统计每个内存页框号出现的次数
  3. 筛选出出现次数大于等于阈值T的内存页框号,这些是热内存页
  4. 对热内存页进行排序:首先按频次降序,频次相同则按页框号升序
  5. 按要求输出结果

在本题中,排序是一个关键点。在大多数语言中,我们可以定义一个自定义的排序规则来实现多条件排序。在Python中,可以使用sort函数的key参数;在C++中,可以重载比较函数;在Java中,可以使用Comparator接口。

时间复杂度分析:

  • 统计频次需要O(N)时间
  • 排序需要O(M log M)时间,其中M是热内存页的数量,最坏情况下M = N
  • 因此,总体时间复杂度为O(N + N log N) = O(N log N)

空间复杂度为O(N),主要用于存储哈希表。

对于给定的数据范围(N最大为10000),这个算法的效率是完全可以接受的。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 读取输入
n = int(input())
page_frames = list(map(int, input().split()))
threshold = int(input())

# 统计每个页框号出现的频次
frequency = {}
for frame in page_frames:
    frequency[frame] = frequency.get(frame, 0) + 1

# 筛选出热内存页
hot_pages = [(frame, freq) for frame, freq in frequency.items() if freq >= threshold]

# 输出结果
print(len(hot_pages))
if hot_pages:
    # 按频次降序排列,频次相同则按页框号升序
    hot_pages.sort(key=lambda x: (-x[1], x[0]))
    for frame, _ in hot_pages:
        print(frame)
  • Cpp
#include <bits/stdc++.h>
using namespace std;

in

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

hwwhwh:同双非,有大厂实习其实也没啥用,主要看运气,等就行了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务