• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            hdu 2835

            2009年8月12日

            題目鏈接:HDU 2835 Operating system  

            分類:OS中cache置換算法的應用

            題目分析與算法原型
                     這是 今天剛做的一道杭電的OJ上的其他多校聯合舉辦的暑期練習賽上的一道題,這是第一題,不過也是通過比較少的題目之一。題目大意就是給你一個Cache(容量已知)然后給你一系列的訪問頁面的序號(可重復,即同一頁面可多次訪問),然后讓你組織一個替換算法,使得這一趟下來,讓你求頁面寫進Cache的最小次數(其實也就是使得訪問的命中率最高),學過操作系統的都了解,現實情況下比較采用的是LRU(最近最少使用頁面替換算法)算法,不能使用那種理想的最優替換算法,因為我們不知道操作系統以后要訪問的頁面順序,所以不可能做全局預測,然而,這道題目卻只能用這種算法,因為我們已經知道所有要訪問的頁面的序號,所以我們可以知道當前時間開始,那個頁面下次訪問到的時間間隔多長都能計算出來,這個時候我們每次替換的時候就應該選擇間隔最長的那個頁面。

                    大體實現如下:
                    先創建一個優先隊列(用最大堆維護,保證隊頭元素的關鍵值最大),每個頁面的頁面好作為堆元素的唯一編號,每個頁面的下次訪問時間,作為關鍵字。

                    1.若當前的頁面第一次出現,且cache容量未滿,則將進入隊列,訪問次數加1
                   2.若當前的頁面第一次出現,且cache容量已經滿了,此時就用它替換隊列中關鍵值最大的那個,訪問次數加1
                   3.若當前的頁面已經在Cache里面,則更新該隊列中此頁面的下次訪問的時間
                  
            關于如何計算每個頁面的下次訪問時間,方法可以有多種,你可以將輸入的頁面按其輸入的頁面號從小到大一級排序,按其訪問的時間二級排序,這樣子同頁面編號的都在一起了,可以方便計算。其實,還有更快的方法,可以不用排序,直接以o(n)的時間復雜度計算每個頁面的下次訪問時間,開兩個數組,next[]和qian[],假設當前訪問時間(既數組下標)為i的頁面編號為m[i]的頁面的下次的訪問時間用next[i]記錄(其中m[]數組記錄的是所有要訪問的頁面),那么qian[m[i]]表示在i之前(0到i-1)的離i最近的編號也為m[i]的頁面的時間(其實就是該頁上次的訪問時間),那么每到一個i,就更新前次m[i]頁面的的下次訪問時間,有next[qian[m[i]]]=i,然后再更新qian[m[i]]=i;這樣子,一遍循環下來就可以算出任何位置上的所有頁面的下次訪問時間了。

            Code:

              1
            #include<stdio.h>
              2#include<string.h>
              3#define len 100005
              4
              5int c,n,b,m[len],next[len],min,count,place[len],cnt[len],qian[len];
              6bool flag[len];
              7
              8struct node
              9{
             10    int key,num;//其中num是唯一標記隊列元素的編號
             11}
            queue[10010];
             12
             13void down_min_heap(int n,int h)//n表示堆元素的個數,從0開始編號,從h開始往下調整
             14{
             15    int i=h,j=2*i+1;
             16    node temp=queue[i];
             17    while(j<n)
             18    {
             19        if(j<n-1&&queue[j].key<queue[j+1].key)j++;//若右孩子存在,且右孩子比較大,取右
             20        if(temp.key>queue[j].key)break;
             21        else
             22        {
             23            place[queue[j].num]=i;
             24
             25            queue[i]=queue[j];
             26            i=j;
             27            j=2*i+1;
             28        }

             29    }

             30    queue[i]=temp;
             31    place[temp.num]=i;
             32}

             33void up_min_heap(int s)    //s表示最后一個的編號,即是n-1,其中n表示堆元素的個數
             34{
             35    while (s>0&&queue[s].key>queue[(s-1)/2].key)     //從s開始往上調整
             36    
             37        place[queue[s].num]=(s-1)/2;
             38        place[queue[(s-1)/2].num]=s;
             39        node tt=queue[s];
             40        queue[s]=queue[(s-1)/2];
             41        queue[(s-1)/2]=tt;
             42        s=(s-1)/2
             43    }

             44}

             45void push(node x)  //count(全局變量)表示隊列中元素的個數,隊列元素從0開始編號
             46{
             47    queue[count]=x;
             48    place[x.num]=count;
             49    count++;
             50    up_min_heap(count-1);
             51}

             52node pop()
             53{
             54    node res=queue[0];
             55    queue[0]=queue[count-1];
             56    place[queue[count-1].num]=0;
             57    count--;
             58    down_min_heap(count,0);
             59    return res;
             60}

             61int main()
             62{
             63    int i;
             64    while(scanf("%d%d%d",&c,&n,&b)!=EOF)
             65    {
             66        memset(flag,false,sizeof(flag));
             67        for(i=0;i<b;i++)
             68        {
             69            qian[i]=-1;
             70            next[i]=b;
             71        }

             72        for(i=0;i<b;i++)
             73        {
             74            scanf("%d",&m[i]);
             75
             76            if(qian[m[i]]!=-1)next[qian[m[i]]]=i;
             77            qian[m[i]]=i;
             78        }

             79        if(b==0)printf("0\n");
             80        else
             81        {
             82            min=0;
             83            count=0;
             84            for(i=0;i<b;i++)
             85            {
             86                if(flag[m[i]]==false)//cache中不存在
             87                {
             88                    if(count<c)//cache未滿,加進來
             89                    {    
             90                        node x;
             91                        flag[m[i]]=true;
             92                        x.key=next[i];
             93                        x.num=m[i];
             94                        push(x);
             95                        min++;
             96                    }

             97                    else if(count==c)//cache滿了,需要替換
             98                    {
             99                        node tt,x=pop();
            100                        flag[x.num]=false;
            101                        flag[m[i]]=true;
            102                        tt.key=next[i];
            103                        tt.num=m[i];
            104                        push(tt);
            105                        min++;
            106                    }

            107                }

            108                else 
            109                {
            110                    int kk=place[m[i]];
            111                    queue[kk].key=next[i];
            112                    up_min_heap(kk);
            113                }

            114            }

            115            printf("%d\n",min);
            116        }

            117    }

            118    return 1;
            119}

            posted on 2009-08-12 19:00 蝸牛也Coding 閱讀(550) 評論(1)  編輯 收藏 引用

            評論

            # re: hdu 2835 2010-01-26 13:27 makejing

            請問如果是使用stl的priority_queue 有什么辦法可以處理元素已經在隊列中然后進行替代的過程。  回復  更多評論   

            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            導航

            統計

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久亚洲AV无码永不| 97超级碰碰碰碰久久久久| 综合久久给合久久狠狠狠97色| 久久综合亚洲色HEZYO国产| 亚洲人成网站999久久久综合 | 亚洲乱亚洲乱淫久久| 久久久久久久综合综合狠狠| 精品久久久一二三区| 丁香久久婷婷国产午夜视频| 久久精品国产免费观看| 99久久精品免费看国产| 一本一本久久A久久综合精品| 久久被窝电影亚洲爽爽爽| 久久人做人爽一区二区三区| 久久99中文字幕久久| 无码伊人66久久大杳蕉网站谷歌| 色综合久久久久网| 99久久免费国产特黄| 久久夜色精品国产噜噜亚洲a| 久久青青草原精品影院| 久久精品国产2020| 亚洲国产综合久久天堂| 久久天堂电影网| 国产亚洲精品美女久久久| 久久精品中文字幕一区| 久久亚洲国产最新网站| 免费一级欧美大片久久网 | 一本久久久久久久| 久久精品人人做人人爽97 | 一本一本久久a久久综合精品蜜桃| 久久播电影网| 欧美午夜精品久久久久久浪潮| 青青青青久久精品国产| 久久久久久久久久久| 久久青青国产| 欧美精品久久久久久久自慰| 国产AV影片久久久久久| 热久久视久久精品18| 色综合久久久久网| 欧洲精品久久久av无码电影 | 青青青国产成人久久111网站|