goj LRU頁面置換算法


Problem Description:

sss操作系統沒聽課, 這周的操作系統作業完全不會, 你能幫他寫出來嗎, 以下是操作系統老師的實驗說明:
LRU算法解釋:
LRU置換算法是選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間t,當須淘汰一個頁面時,選擇現有頁面中其t值最大的,即最近最久未使用的頁面予以淘汰。 
LRU的實現(需要“堆棧”支持):
可利用一個特殊的棧來保存當前使用的各個頁面的頁面號。每當進程訪問某頁面時,便將該頁面的頁面號從棧中移出,將它壓入棧頂。因此,棧頂始終是最新被訪問頁面的編號,而棧底則是最近最久未使用頁面的頁面號.

Input:

多組輸入
每組數據第一行為n(1<=n<=100),n為頁面棧的大小, m(1<=m<=500000), m為需要訪問的頁面序列長度, 第二行為訪問頁面序列a1~am (0<=ai<=1000)

Output:

輸出一行, 最后棧內的元素(從棧底開始輸出)

Sample Input:

5 11
4 7 0 7 1 0 1 2 1 2 6

Sample Output:

7 0 1 2 6
解題思路:結合LRU置換算法的定義舉個栗子:假設現有一進程所訪問的頁面序列為:4,7,0,7,1,0,1,2,1,2,6。隨着進程的訪問,棧中頁面號的變化情況如圖所示。在訪問頁面6時發生了缺頁,此時頁面4是最近最久未被訪問的頁,應將它置換出去。此題直接暴力模擬即可。正確做法:雙向鏈表+哈希表!

AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn=500005;
 5 int n,m,x,cnt,stk[110],pos[maxn];
 6 int main(){
 7     while(cin>>n>>m){
 8         cnt=0;memset(pos,0,sizeof(pos));//標記頁面在棧中的位置
 9         while(m--){
10             cin>>x;
11             if(pos[x]){//棧中已出現x,將x提到棧頂,剩下的頁面往下移
12                 for(int i=pos[x];i<cnt;++i)stk[i]=stk[i+1],pos[stk[i]]=i;
13                 stk[cnt]=x,pos[x]=cnt;
14             }
15             else{//x未出現
16                 if(cnt!=n)stk[++cnt]=x,pos[x]=cnt;//棧未滿則直接添加
17                 else{//棧滿,移去最久未使用的頁面,將x放棧頂
18                     for(int i=1;i<n;++i)stk[i]=stk[i+1],pos[stk[i]]=i;
19                     stk[n]=x,pos[x]=n;
20                 }
21             }
22         }
23         for(int i=1;i<=cnt;++i)cout<<stk[i]<<(i==cnt?'\n':' ');//輸出當前棧中的頁面號
24     }
25     return 0;
26 }
 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM