cache_realisation_CPP/Ideal_cache.h
2024-09-22 03:25:10 +03:00

69 lines
2.4 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
};