华为od机试真题:内存冷热标记(Python)

华为od机试

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集

题目描述

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

一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,要实现基于频次的冷热标记。内存页使用页框号作为标识。

输入描述

第一行输入为 N, 表示访存序列的记录条数, 0 < N ≤ 10000。

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

第三行为热内存的频次阈值 T ,正整数范围 1 ≤ T ≤ 10000。

输出描述

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

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

示例1

输入:
10
1 2 1 2 1 2 1 2 1 2
5

输出:
2
1
2

说明:
内存页 1 和内存页 2 均被访问了5 次,达到了阈值5 ,因此热内存页有2个。内存页1 和内存页 2 的访问频次相等,页框号小的排前面。

示例2

输入:
5
1 2 3 4 5
3

输出:
0

说明:
从访问跟踪里面访问频次没有超过 3 的,因此热内存个数为 0。

题解

题目类型

这道题属于哈希表及排序类型的算法题,涉及到数据统计和排序处理。

解题思路
  1. 数据读取与预处理
    • 首先读取访存记录的总条数 N
    • 读取 N 个内存页框号并统计每个页框号的访问次数。
    • 读取热内存的频次阈值 T
  2. 统计频次
    • 使用 collections.Counter 来统计每个内存页框号的访问频次。
  3. 过滤与排序
    • 过滤出访问频次大于等于 T 的内存页框号。
    • 根据访问频次从高到低排序,如果频次相同,则按页框号从小到大排序。
  4. 输出结果
    • 输出标记为热内存的内存页个数。
    • 按照排序结果输出每个热内存页框号。
代码大致描述

代码使用 Counter 统计访问频次,并过滤出频次大于等于阈值的内存页框号。然后根据访问频次降序、页框号升序排序,并输出结果。

Python

from collections import Counter

# 读取访存序列的记录条数
n = int(input())

# 读取访存的内存页框号序列
a = list(map(int, input().split()))

# 读取热内存的频次阈值
t = int(input())

# 使用Counter统计每个内存页框号的访问频次
freq = Counter(a)

# 过滤出访问频次大于等于阈值t的内存页框号,并存入列表
lst = [(page, cnt) for page, cnt in freq.items() if cnt >= t]

# 对列表进行排序,按访问频次从高到低排序,频次相同按页框号从小到大排序
lst.sort(key=lambda x: (-x[1], x[0]))

# 输出热内存页的数量
print(len(lst))

# 逐行输出热内存页框号
for page, cnt in lst:
    print(page)

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什码情况

你的鼓励就是我最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值