【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%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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