69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
#include <iostream>
|
||
#include <vector>
|
||
#include <unordered_map>
|
||
#include <algorithm>
|
||
|
||
class Ideal_Cache {
|
||
private:
|
||
int capacity;
|
||
std::vector<int> cache;
|
||
std::unordered_map<int, int> cacheMap; // Для быстрого доступа к индексам
|
||
|
||
|
||
public:
|
||
Ideal_Cache(size_t capacity) : capacity(capacity) {}
|
||
|
||
int tic_number = 0;
|
||
|
||
void get_request_vector(const std::vector<int>& requests) {
|
||
// смотрим есть ли айди в кэше
|
||
// Есть - тик
|
||
// Нет - смотрим размер, если размер не полный добавляем в кэш
|
||
// если размер полный, то уберем тот, который позже всех встретится
|
||
|
||
|
||
for (size_t i = 0; i < requests.size(); ++i) {
|
||
int item = requests[i];
|
||
|
||
if (cacheMap.find(item) != cacheMap.end()) {
|
||
tic_number++; //tic
|
||
continue;
|
||
}
|
||
|
||
if (cache.size() < capacity) {
|
||
cache.push_back(item);
|
||
cacheMap[item] = cache.size() - 1;
|
||
} else {
|
||
int farthest = -1;
|
||
int indexToRemove = -1;
|
||
|
||
for (size_t j = 0; j < cache.size(); ++j) {
|
||
auto nextIndex = std::find(requests.begin() + i, requests.end(), cache[j]); //находим следующее вхождение (начиная с i ого тк предыдущие обработались)
|
||
|
||
if (nextIndex == requests.end()) {
|
||
indexToRemove = j; //В конце удалим последний
|
||
break;
|
||
} else {
|
||
int nextIdx = std::distance(requests.begin(), nextIndex);
|
||
if (nextIdx > farthest) {
|
||
farthest = nextIdx;
|
||
indexToRemove = j;
|
||
}
|
||
}
|
||
}
|
||
|
||
cacheMap.erase(cache[indexToRemove]);
|
||
cache[indexToRemove] = item;
|
||
cacheMap[item] = indexToRemove;
|
||
}
|
||
}
|
||
}
|
||
|
||
void info() const {
|
||
std::cout << "ideal cache: ";
|
||
for (int item : cache) {
|
||
std::cout << item << " ";
|
||
}
|
||
std::cout << std::endl;
|
||
}
|
||
}; |