알고리즘/Hash Table

해싱 - LRU Cache

Algorithmus 2022. 3. 10. 22:28

LRU cache

LRU cache (Least Recently Used cache) 는 일정한 capacity를 정해두고 최근에 참조(lookup) 나 삽입(insert) 된 것을 Most Recently Used entry 로서 삭제 순위를 가장 후순위로 보내는 캐시를 말한다. 이 캐시로서 dict 등의 해시 테이블 자료구조가 쓰일 수 있다. 왜냐하면 O(1) 시간만에 참조와 변경을 할 수 있기 때문이며, 쓰이지 않는 기록은 자연히 삭제의 선순위로 밀려 새로운 key가 들어올때 쫒겨나기 때문이다.

구현

capacity를 주고 queue를 이용해서 LRUCache를 구현하되 lookup(key) 해도 키가 없으면 -1을, erase(key) 할때 key가 있으면 True 없으면 False를 돌려주며, insert(key, value) 시에는 만일 기존의 값이 있다면 그 값을 업데이트 하지 않고 삭제 큐의 맨 후순위로 보낸다.

class LRUCache:
    def __init__(self, capacity):
        self._capacity = capacity
        self._entry = collections.OrderedDict()   # Hash table with Queue property
    
    def lookup(self, key):
        if key not in self._entry:
            return -1
        # Send the looked up key to the front
        result = self._entry.pop(key)             # Hash table allows pop operation
        self._entry[key] = result
        return result
        
    def insert(self, key, val):
        # If we already have it, we don't update but just move to front
        if key in self._entry:
            val = self._entry.pop(key)
        # In case of overcapacity, evict LRU entry
        elif len(self._entry) >= self._capacity:
            self._entry.popitem(last=False)   # key-value pair, pop the oldest (first) item
        self._entry[key] = val     # Insert the key-value at the rear of queued hash
    
    def erase(self, key):
        if key in self._entry:
            self._entry.pop(key)
            return True
        else:
            return False

반응형

'알고리즘 > Hash Table' 카테고리의 다른 글

해싱  (0) 2022.03.14