哈希表算法

内存冷热标记

2025-11-11  本文已影响0人  何以解君愁

 现代计算机系统中通常存在多级的存储设备,针对海量workload的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。
 一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定阈值,则认为是热内存页,否则是冷内存页。
 对于统计窗口内跟踪到的访存序列和阈值,现在需要实现基于频次的冷热标记。内存页使用页框号作为标识。

 输入描述:
  第一行为输入为N,表示访存序列的记录条数,0 < N < 10000。
  第二行为访存序列,空格间隔的N个内存页框号,页框号范围0-65535,同一页框号可能重复出现,出现的次数即为对应页框号的频次。
  第三行为热内存页的频次阈值T,正整数,范围1< T < 10000
 输出描述
  第一行输出标记为热内存的内存页个数,如果没有被标记为热内存的,则输出0。
  如果第一行>0,则接下来按照访问频次降序输出内存页框号,一行一个,频次一样的页框号,页框号小的排前面。

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int length = sc.nextInt();
        int[] nums = new int[length];
        for(int i = 0;i < length;i++){
            nums[i] = sc.nextInt();
        }
        int checkCount = sc.nextInt();
        
        Map<Integer,Integer> numMap = new HashMap<>();
        Map<Integer,Integer> resMap = new HashMap<>();
        
        int hotCount = 0;
        for(int i = 0;i < length;i++){
            int number = numMap.getOrDefault(nums[i],0)+1;
            numMap.put(nums[i],number);
        }
        
        for(int i = 0;i < length;i++){
            int number = numMap.getOrDefault(nums[i],0);
            int number1 = resMap.getOrDefault(nums[i],0);
            if(number1 != 0){
                continue;
            }
            if(number >= checkCount){
                resMap.put(nums[i],number);
            }
        }
        System.out.println(resMap.size());
        List<Integer> ans = new ArrayList<>(resMap.keySet());
        ans.sort((a, b) -> {
            int freqCompare = resMap.get(b).compareTo(resMap.get(a));
            if (freqCompare == 0) {
                return a.compareTo(b);
            }
            return freqCompare;
        });

        for (int num : ans) {
            System.out.println(num);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读