最佳页面置换算法
https://ac.nowcoder.com/acm/problem/20185
import heapq
class Solution:
def __init__(self, mem_id_list: List[int], capacity: int):
self.mem_id_list: list[int] = mem_id_list
self.capacity = capacity
# 记录cache中已有的内存编号
self.cache_map: dict[int, bool] = {}
# next数组
self.next: list[int] = [0] * len(mem_id_list)
# 堆用于记录下次出现的下标
self.heap: list[int] = []
def init_next(self, length):
mp = {}
# 从后往前记录
for idx in range(length - 1, -1, -1):
mem_id = self.mem_id_list[idx]
if self.mem_id_list[idx] in mp:
self.next[idx] = mp[mem_id]
else:
self.next[idx] = length + 100
# 记录
mp[mem_id] = idx
def cache(self, mem_id_list: List[int], capacity: int) -> int:
# 最佳页面置换算法:当需要弹出缓存,确认当前cache中的内存编号和未来要访问的内存的距离,找到距离最远的,淘汰掉,最近的保留
self.mem_id_list = mem_id_list
miss_cnt = 0
length = len(mem_id_list)
self.init_next(length)
num = 0
for i, mem_id in enumerate(mem_id_list):
if self.cache_map.get(i, False) == False:
miss_cnt += 1
if num < capacity:
num += 1
self.cache_map[self.next[i]] = True
heapq.heappush(self.heap, -(self.next[i]))
else:
self.cache_map[-self.heap[0]] = False
heapq.heappop(self.heap)
self.cache_map[self.next[i]] = True
heapq.heappush(self.heap, -(self.next[i]))
else:
self.cache_map[self.next[i]] = True
heapq.heappush(self.heap, -(self.next[i]))
return miss_cnt
if __name__ == "__main__":
while True:
try:
access_times, capacity = list(map(int, input().split(" ")))
mem_id_list: list[int] = list(map(int, input().split(" ")))
print(Solution(mem_id_list, capacity).cache(mem_id_list, capacity))
except:
break

