146. LRU 캐 시 시스템 HashMap + 양 방향 링크 실현 O (1) 복잡 도
18690 단어 leetcode
사고방식: HashMap + 양 방향 체인 테이블 의 사고방식 을 이용 하 는 것 은 사실 매우 간단 하 다. 매번 put / get 조작 이 이미 있 는 노드 를 방문 한 후에 노드 를 양 방향 체인 테이블 의 끝으로 이동한다.put 에 없 는 결점 을 넣 으 면 바로 끝부분 에 삽입 하면 됩 니 다.put 작업 을 할 때 cache 공간 이 부족 하면 첫 번 째 노드 를 제거 합 니 다 (LRU 가 최근 에 가장 적 게 사용 한 노드).
자바 에는 링크 드 하 쉬 맵 이 있 습 니 다. 우 리 는 이 종 류 를 계승 하면 위의 방법 을 쉽게 실현 할 수 있 습 니 다.
class LRUCache{
class Node{
int key;
int val;
Node pre;
Node next;
}
private int idx; // cache
private int capacity; //cache
private HashMap<Integer, Node> cache;
private Node head; // O(1)
private Node tail; // O(1)
public LRUCache(int capacity) {
head = new Node();
tail = new Node();
head.next = tail;
tail.pre = head;
idx = 0;
this.capacity = capacity;
cache = new HashMap<>(capacity); // rehash
}
private void remove(Node node){ //
Node tempPre = node.pre;
Node tempNext = node.next;
tempPre.next = tempNext;
tempNext.pre = tempPre;
}
private void setLast(Node node){ //
Node tempTailPre = tail.pre;
tempTailPre.next = node;
node.pre = tempTailPre;
node.next = tail;
tail.pre = node;
}
private void removeHead(){ //
Node temp = head.next;
head.next = temp.next;
temp.next.pre = head;
cache.remove(temp.key);
}
public int get(int key) {
if(cache.containsKey(key)){
Node cur = cache.get(key);
if(tail.pre == cur){
return cur.val;
}
remove(cur);
setLast(cur);
return cur.val;
}
return -1;
}
public void put(int key, int value) {
Node cur = cache.get(key);
if(cur == null){
Node newNode = new Node();
newNode.key = key;
newNode.val = value;
if(idx >= capacity){ // cache
removeHead();
}
++idx;
setLast(newNode);
cache.put(key, newNode);
}else {
cur.val = value;
remove(cur);
setLast(cur);
}
}
}
LinkedHashMap 실현
class LRUCache{
private LRU cache;
public LRUCache(int capacity) {
this.cache = new LRU(capacity);
}
public int get(int key) {
if (cache.containsKey(key)) {
return cache.get(key);
}
return -1;
}
public void put(int key, int value) {
cache.put(key, value);
}
class LRU extends LinkedHashMap<Integer, Integer> {
int capacity;
public LRU(int capacity) {
// ordering mode, (put、get)
super(capacity, 0.75f, true);
this.capacity = capacity;
}
//removeEldestEntry ,
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> entry) {
return this.size() > capacity;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다. 빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.