버클 알고리즘 문제 - 146 LRU 캐 시 메커니즘
12400 단어 데이터 구조 와 알고리즘
당신 이 파악 한 데이터 구 조 를 활용 하여 하 나 를 설계 하고 실현 하 세 요. LRU (최근 최소 사용) 캐 시 메커니즘.데이터 get 을 가 져 오고 데 이 터 를 기록 하 는 put 를 지원 해 야 합 니 다.
데이터 get (key) 가 져 오기 - 키 (key) 가 캐 시 에 존재 하면 키 의 값 (항상 정수) 을 가 져 옵 니 다. 그렇지 않 으 면 - 1 을 되 돌려 줍 니 다.데이터 put (key, value) 를 기록 합 니 다. - 키 가 존재 하지 않 으 면 데이터 값 을 기록 합 니 다.캐 시 용량 이 상한 선 에 이 르 렀 을 때 새 데 이 터 를 쓰기 전에 최근 에 가장 적 게 사용 한 데이터 값 을 삭제 하여 새로운 데이터 값 에 공간 을 남 겨 야 합 니 다.
진급:
당신 은 있 을 수 있 습 니까? O (1) 시간 복잡 도 에서 이 두 가지 조작 을 완성 합 니까?
예시:
LRUCache cache = new LRUCache (2 / * 캐 시 용량 * /);
cache.put(1, 1);cache.put(2, 2);cache.get(1); // 1cache. put (3, 3); /이 동작 은 키 2 를 cache. get (2) 로 폐기 합 니 다. /반환 - 1 (찾 을 수 없 음) cache. put (4, 4); /이 동작 은 키 1 을 cache. get (1) 로 폐기 합 니 다. /반환 - 1 (찾 을 수 없 음) cache. get (3); /3cache. get (4); /돌아오다
[문제 풀이 아이디어!]
블 로그 참조: 좌 신 알고리즘 진급 반 54 변경 가능 한 캐 시 구조 설계 (LRU)
【 코드 】
1 class LRUCache {
2 public:
3 LRUCache(int capacity) {
4 this->capacity = capacity;
5 }
6
7 int get(int key) {
8 if (map.find(key) == map.end())
9 return -1;
10 Node* p = map[key];
11 update(p);//
12 return p->val;
13 }
14
15 void put(int key, int value) {
16 if (map.find(key) == map.end())//
17 {
18 if (this->map.size() == this->capacity)//
19 {
20 Node* p = this->head->next;
21 this->head->next = p->next;//
22 if (p->next == nullptr)//
23 end = head;
24 else
25 p->next->pre = head;
26 map.erase(p->key);// ,
27 delete p;
28 }
29 Node* p = new Node(key, value);//
30 this->end->next = p;
31 p->pre = end;
32 end = p;
33 map[key] = p;//
34 }
35 else// ,
36 {
37 Node* p = map[key];//
38 p->val = value;//
39 update(p);//
40 }
41 }
42
43 private:
44 struct Node
45 {
46 int key;
47 int val;
48 Node* pre;
49 Node* next;
50 Node(int k, int v) :key(k), val(v), pre(nullptr), next(nullptr) {}
51 };
52
53 int capacity = 0;
54 hash_map<int, Node*>map;
55 Node* head = new Node(' ', -1);//
56 Node* end = head;//
57 void update(Node* p)
58 {
59 if (p == end)
60 return;//p
61 Node* q = p->pre;
62 q->next = p->next;
63 p->next->pre = q;
64 end->next = p;
65 p->pre = end;// p ,
66 end = p;
67 }
68 };
69
70 /**
71 * Your LRUCache object will be instantiated and called as such:
72 * LRUCache* obj = new LRUCache(capacity);
73 * int param_1 = obj->get(key);
74 * obj->put(key,value);
75 */
76
77 void Test()
78 {
79 LRUCache* rr = new LRUCache(1);
80 rr->put(2, 1);
81 cout << rr->get(2) << endl;
82 rr->put(2, 2);
83 cout << rr->get(2) << endl;
84 rr->get(2);
85 rr->put(3, 2);
86 rr->get(2);
87 rr->get(3);
88
89
90 }
다음으로 전송:https://www.cnblogs.com/zzw1024/p/11075357.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.