页面置换算法实现

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
相关推荐
lueluelue472 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水1685 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子5 小时前
Adaboost算法原理与计算实例
算法
别怪我很水6 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚9 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机9 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*9 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木9 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
alexwang21110 小时前
HDU 4348 详细题解
c++·算法·题解·hdu·主席树·可持久化数据结构·可持久化线段树