页面置换算法实现

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
相关推荐
hetao173383725 分钟前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6261 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan1 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356382 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah3 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO93 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician3 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.3 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o4 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者4 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express