LRU は最も最近使用されていないことを表します。 LRU キャッシュは、キャッシュの容量に達すると、最も最近使用されていないエントリが削除されるタイプのキャッシュです。
参考:
LRU キャッシュを JavaScript で実装する方法の基本的な例を次に示します:
// Why we need this LRU class Node { constructor(key, value) { this.key = key; this.value = value; this.next = null; this.prev = null; } } //Least Recently used class LRU { constructor() { this.head = this.tail = null; this.map = new Map(); this.size = 0; // Why I added size, because may be in future we can say if capacity reach to the size, we will remove the tail first and then insert. } get(key) { if (this.map.has(key)) { const node = this.map.get(key); if (node !== this.head) { this.remove(node); this.insert(node); } return node.value; } return -1; } update(key, value) { if (this.map.has(key)) { let node = this.map.get(key); node.value = value; if (node !== this.head) { this.remove(node); this.insert(node); } return node.value; } else { console.log('Key not found'); // Here we can check for capacity if available we can call insert // if capacity is not available we will remove the tail and then insert. } } remove(node) { if (node === this.tail) { this.tail = this.tail.prev; } const prevNode = node.prev; const nextNode = node.next; prevNode.next = nextNode; nextNode.prev = prevNode; } insert(key, value) { const newNode = new Node(key, value); this.map.set(key, newNode); if (this.head === null) { this.head = this.tail = newNode; this.size = 1; return; } // We need to insert at the Begining newNode.next = this.head; this.head.prev = newNode; this.head= newNode; this.size ; return; } } const test = new LRU(); test.insert('A', 20); test.insert('B', 10); test.insert('C', 5); test.insert('D', 7); console.log(test); console.log('------------------'); console.log('C ---> ', test.get('C')); console.log('D ---> ', test.get('D')); console.log('D ---> ', test.update('B', 100)); /* LRU { tail: Node { key: 'A', value: 20, next: null, prev: Node { key: 'B', value: 10, next: [Circular *1], prev: [Node] } }, head: Node { key: 'D', value: 7, next: Node { key: 'C', value: 5, next: [Node], prev: [Circular *2] }, prev: null }, map: Map(4) { 'A' => Node { key: 'A', value: 20, next: null, prev: [Node] }, 'B' => Node { key: 'B', value: 10, next: [Node], prev: [Node] }, 'C' => Node { key: 'C', value: 5, next: [Node], prev: [Node] }, 'D' => Node { key: 'D', value: 7, next: [Node], prev: null } }, size: 4 } ------------------ C ---> 5 D ---> 7 D ---> 100 B ---> 100 */
ご不明な点がございましたら、お気軽にご連絡ください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3