页面置换算法实现

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
相关推荐
To_OC4 小时前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635079 小时前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC10 小时前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥11 小时前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程
地平线开发者12 小时前
Transformer模型部署之性能优化指南
算法
地平线开发者12 小时前
人在途中:从“编译失败”到“模型可落地”——CUDA 自定义算子
算法·自动驾驶
半个落月15 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星16 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星16 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试