页面置换算法实现

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
相关推荐
拓恒技术5 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
晨曦中的暮雨5 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫5 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
罗西的思考7 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
淡海水7 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
下一站春风里9 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot9 小时前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
用户老李9 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法
深圳市益普科技有限公司10 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
程序员清风11 小时前
算法题中的边界条件、测试与调试
开发语言·算法·kotlin