FIFO页面置换
问题:实现先进先出的缓存模拟,数n表示缓存的大小,数组arr[]表示将要进入缓存的页面,数len表示数组的长度,计算未命中数。如果缓存已满则将存在时间最长的页面淘汰。初时,内存为0
(原题说的相当复杂,其实就是上面的这个意思)
例如
2 6
1 2 1 3 1 2
内存 | 页面 | 未命中 |
---|---|---|
0 0 | 1 | yes |
1 0 | 2 | yes |
2 1 | 1 | no |
2 1 | 3 | yes |
3 2 | 1 | yes |
1 3 | 2 | yes |
所以命中数为5.
- 代码一:当时就想用数组,没治了
void Fun(int n, int arrQ[], int len)
{
int * arr = new int[n];
int countNum = 0;
bool falg = false;
memset(arr, 0, n*sizeof(arr));
for (int i = 0; i < len; i++)
{
falg = Find(arrQ, arr, i, n);
if (falg == false)
{
countNum++;
ChangeArr(arr, n, arrQ, i);
}
}
cout << countNum << endl;
}
bool Find(int arrQ[], int arr[], int i, int n)
{
for (int j = 0; j < n; j++)
{
if (arrQ[i] == arr[j])
return true;
}
return false;
}
void ChangeArr(int arr[], int n,int arrQ[],int ji)
{
for (int i = n - 1; i > 0; i--)
{
arr[i] = arr[i - 1];
}
arr[0] = arrQ[ji];
}
- 代码二:
int Fun(int n,int arrQ[],int len)
{
list<int > lis;
list <int>::iterator it;
int countNum = 0;
lis.push_back(0);
it = lis.begin();
for (int i = 0; i < len; i++)
{
it = find(lis.begin(), lis.end(), arrQ[i]);
if (it == lis.end())
{
countNum++;
lis.push_back(arrQ[i]);
if (lis.size() > n)
{
lis.pop_front();
}
}
}
return countNum;
}
其实仔细想想都很简单,下次一定好好审题。