页面置换算法实现

FIFO

复制代码
#include <iostream> 
#include <vector>
#include <queue>
#include <unordered_map>

using namespace std;

int FIFO(int frames, vector<int> seq) {
	queue<int> q;
	unordered_map<int, int> idx;
	vector<int> have(frames, 0);
	int miss = 0;
	
	for (auto x : seq) {
		bool fault = false;
		int pos = q.size();
		if(idx.find(x) == idx.end()) {  //当前块里面没有需要的数据
			miss++;
			fault = true;
			if (q.size() == frames) {
				int out = q.front();
				q.pop();
				pos = idx[out];
				idx.erase(out);
			}
			q.push(x);
			idx[x] = pos; 
			have[pos] = x;
		}
		
		//输出
		//queue<int> tmp = q;
		for (auto y : have) cout << y << ' ';
		cout << (fault ? 'T' : 'F') << endl; 
	}
	
	return miss;
}

int main(void) {

    cout << "start" << endl;
	int frames, n; cin >> frames >> n;
	vector<int> seq(n);
	for (int i = 0; i < n; ++i ) cin >> seq[i];
	
	int miss = FIFO(frames, seq);
	double rate = miss * 1.0 / n * 100;
	printf("%s%.2f%c", "缺页率: ", rate, '%');

}



//样例来自作业16题   输出序列 缺页率
//5 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6

//样例来自作业14题    输出缺页率
//4 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6

LRU

复制代码
//
// Created by xuchangzhen on 2026-06-03.
//
#include <iostream>
#include <vector>
#include <unordered_map>
#include <list>

using namespace std;

void remove_element(list<int>& lru_list, int pos, int ele){
    for (list<int>::iterator it = lru_list.begin(); it != lru_list.end(); ++it) {
        if (*it == ele) {
            lru_list.erase(it);
            return ;
        }
    }
}

int LRU(int frames, vector<int> seq) {
    list<int> lru_list;
    unordered_map<int, int> idx;
    vector<int> have(frames, 0);
    int miss = 0;

    for (auto x : seq) {
        bool fault = false;
        int pos = lru_list.size();
        if(idx.find(x) == idx.end()) {  //当前块里面没有需要的数据
            miss++;
            fault = true;
            if (lru_list.size() == frames) {
                int out = lru_list.back();
                lru_list.pop_back();
                pos = idx[out];
                idx.erase(out);
            }
            lru_list.push_front(x);
            idx[x] = pos;
            have[pos] = x;
        }else{
            pos = idx[x];
//            cout << "in" << endl;
            remove_element(lru_list, pos, x);
            lru_list.push_front(x);
        }

        //输出
//        cout << "list序列: ";
//        for (auto y : lru_list) cout << y << ' ';
//        cout << endl;
        for (auto y : have) cout << y << ' ';
        cout << (fault ? 'T' : 'F') << endl;
    }

    return miss;
}

int main(void) {

    cout << "start" << endl;
    int frames, n; cin >> frames >> n;
    vector<int> seq(n);
    for (int i = 0; i < n; ++i ) cin >> seq[i];

    int miss = LRU(frames, seq);
    double rate = miss * 1.0 / n * 100;
    printf("%s%.2f%c", "缺页率: ", rate, '%');

}



//使用链表来表示最近使用的数据 长时间未被使用的数据会被挤到链表尾部

//样例来自作业16题   输出序列 缺页率
//5 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6

//样例来自作业14题    输出缺页率
//4 20 1 2 3 4 2 1 5 6 2 1 2 3 7 6 3 2 1 2 3 6

//样例来自作业17题   输出缺页率
//3 12 4 3 2 1 4 3 5 4 3 2 1 5
//4 12 4 3 2 1 4 3 5 4 3 2 1 5
相关推荐
kevin_kang5 小时前
第05章 实时语音识别的 ASR 原理
算法
kevin_kang5 小时前
第04章 断句原理:本地 VAD 与神经网络 VAD
算法
kevin_kang5 小时前
第06章 文字转语音的 TTS 原理
算法
6Hzlia5 小时前
【Classic 150 刷题计划】 LeetCode 123. 买卖股票的最佳时机 III | C++ 状态机动态规划与通用交易拓展
c++·算法·leetcode
luj_17686 小时前
生物体如何应对功能击穿?
c语言·开发语言·c++·经验分享·算法
luj_17686 小时前
击穿分析五大关键步骤
开发语言·网络·c++·经验分享·算法
星空6 小时前
Map<String, String>`Map`是接口,不能直接 new
java·前端·算法
shirsl6 小时前
算法 Day3-队列 / deque + 链表
数据结构·python·算法·链表
码流子6 小时前
2026 图像数据标注工具横评:LabelImg / CVAT / Label Studio / X-AnyLabeling / 国产Web平台,到底怎么选?
大数据·人工智能·算法
hansang_IR6 小时前
【题解】[JSOI2016] 最佳团体(分数规划)
c++·算法