如何编写最佳页面替换算法?

时间:2014-08-03 16:51:08

标签: c++ arrays algorithm priority-queue page-replacement

我正在分享我的逻辑。我需要知道它是否可以。

我创建了一个数组,用于存储每个页面的总出现次数。

对于ex - 如果页面要求序列是{1,2,3,1,2}。让我们称之为" seq"阵列。

然后数组= {2,2,1}。让我们称之为" count"阵列

现在,我遍历seq并分配一帧,直到我不耗尽所有帧或者帧已经没有在内存中。然后我把它推到框架号。而其余的没有。发生在最小优先级队列中。

    for (int i = 1; i <= M; ++i)
    {
        if (frameAssigned[arr[i]] != 0)    //frame already assigned
        {
            count[arr[i]]--;
            PQ.push(ii(count[arr[i]], arr[i]));
            continue;
        }

        if (freeFrames >= 1)
        {
            frameAssigned[arr[i]] = presentFrame++; //presentFrame=0 initially
            freeFrames--;
            noOfReplacements++;
            count[seq[i]]--;
            PQ.push(ii(count[seq[i]], seq[i]));
            continue;
        }

    //Now, if all free frames are exhausted, I do the following. Replace the page which is 
    //occurring the minimum number of times.

    ii temp = PQ.top(); // ii = pair<int,int>
    PQ.pop();
    int frameNumber = temp.second;
    count[seq[i]]--;
    if (seq[arr[i]] >= 0) PQ.push(ii(count[seq[i]], seq[i]));
    frameAssigned[arr[i]] = frameAssigned[custNumber];
    frameAssigned[custNumber] = 0;
    noOfReplacements++;

但是,这个算法似乎不正确。我不明白为什么。我找到了正确的算法here,但我不明白为什么我的工作没有。

1 个答案:

答案 0 :(得分:1)

让我们看看下面的页面出现:

1,2,3,2,3,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1

让我们假设2页可以保存在内存中。根据你的算法,当3将第一次到达时,2将被替换,因为1的出现次数相当高,这不是最优的。

在最佳页面替换算法中,页面替换的标准基于再次引用页面之前的时间。


我建议您在问题http://www.codechef.com/AUG14/problems/CLETAB出版后仔细阅读此问题的编辑。